SoftwareSerial

This commit is contained in:
Yuri Trikoz
2020-06-22 17:40:29 +03:00
parent f7e3515c82
commit 8f395ccc8a
12 changed files with 274 additions and 242 deletions

View File

@@ -25,6 +25,7 @@
#include "Utils\WiFiUtils.h" #include "Utils\WiFiUtils.h"
//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК=============== //=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК===============
#include <SoftwareSerial.h>
#include <Adafruit_BME280.h> #include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h> #include <Adafruit_BMP280.h>
#include <Bounce2.h> #include <Bounce2.h>
@@ -62,7 +63,7 @@ extern AsyncWebServer server;
extern DallasTemperature sensors; extern DallasTemperature sensors;
extern boolean but[NUM_BUTTONS]; extern boolean but[NUM_BUTTONS];
extern Bounce *buttons; extern Bounce* buttons;
/* /*
* Global vars * Global vars
@@ -205,11 +206,10 @@ extern boolean connectMQTT();
extern boolean publishData(const String& topic, const String& data); extern boolean publishData(const String& topic, const String& data);
extern boolean publishChart(const String& topic, const String& data); extern boolean publishChart(const String& topic, const String& data);
extern boolean publishStatus(const String& topic, const String& state);
extern boolean publishControl(String id, String topic, String state); extern boolean publishControl(String id, String topic, String state);
extern boolean sendSTATUS(String topic, String state); extern void reconnectMQTT();
extern void do_mqtt_connection();
//Scenario //Scenario
extern void eventGen(String event_name, String number); extern void eventGen(String event_name, String number);
@@ -284,10 +284,10 @@ extern void do_mqtt_send_settings_to_udp();
extern void Web_server_init(); extern void Web_server_init();
// iot_firmware // iot_firmware
extern void handleCMD_loop(); extern void loopCmd();
extern void handleButton(); extern void loopButton();
extern void handleScenario(); extern void loopScenario();
extern void handleUdp(); extern void loopUdp();
extern void do_upgrade_url(); extern void do_upgrade_url();
extern void do_upgrade(); extern void do_upgrade();

View File

@@ -0,0 +1,11 @@
#pragma once
#include <Arduino.h>
#include "CommonTypes.h"
const String getPresetFile(uint8_t preset, ConfigType_t type);
const String getItemName(Item_t item);
const Item_t getPresetItem(uint8_t preset);

View File

@@ -5,6 +5,7 @@ Bounce *buttons = new Bounce[NUM_BUTTONS];
Servo myServo1; Servo myServo1;
Servo myServo2; Servo myServo2;
SoftwareSerial *mySerial = nullptr;
void CMD_init() { void CMD_init() {
sCmd.addCommand("button", button); sCmd.addCommand("button", button);
@@ -165,12 +166,14 @@ void buttonSet() {
eventGen("button", button_number); eventGen("button", button_number);
jsonWriteStr(configLiveJson, "button" + button_number, button_state); jsonWriteStr(configLiveJson, "button" + button_number, button_state);
sendSTATUS("button" + button_number, button_state);
publishStatus("button" + button_number, button_state);
} }
void buttonChange() { void buttonChange() {
String button_number = sCmd.next(); String button_number = sCmd.next();
String current_state = jsonReadStr(configLiveJson, "button" + button_number); String current_state = jsonReadStr(configLiveJson, "button" + button_number);
if (current_state == "1") { if (current_state == "1") {
current_state = "0"; current_state = "0";
} else if (current_state == "0") { } else if (current_state == "0") {
@@ -178,7 +181,7 @@ void buttonChange() {
} }
order_loop += "buttonSet " + button_number + " " + current_state + ","; order_loop += "buttonSet " + button_number + " " + current_state + ",";
jsonWriteStr(configLiveJson, "button" + button_number, current_state); jsonWriteStr(configLiveJson, "button" + button_number, current_state);
sendSTATUS("button" + button_number, current_state); publishStatus("button" + button_number, current_state);
} }
void pinSet() { void pinSet() {
@@ -226,7 +229,8 @@ void pwmSet() {
eventGen("pwm", pwm_number); eventGen("pwm", pwm_number);
jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state);
sendSTATUS("pwm" + pwm_number, pwm_state);
publishStatus("pwm" + pwm_number, pwm_state);
} }
//================================================================================================================== //==================================================================================================================
//==========================================Модуль физической кнопки================================================ //==========================================Модуль физической кнопки================================================
@@ -240,7 +244,7 @@ void switch_() {
but[switch_number.toInt()] = true; but[switch_number.toInt()] = true;
} }
void handleButton() { void loopButton() {
static uint8_t switch_number = 1; static uint8_t switch_number = 1;
if (but[switch_number]) { if (but[switch_number]) {
@@ -257,7 +261,9 @@ void handleButton() {
} }
} }
switch_number++; switch_number++;
if (switch_number == NUM_BUTTONS) switch_number = 0; if (switch_number == NUM_BUTTONS) {
switch_number = 0;
}
} }
//===================================================================================================================================== //=====================================================================================================================================
@@ -279,7 +285,7 @@ void digitSet() {
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, value); jsonWriteStr(configLiveJson, "digit" + number, value);
sendSTATUS("digit" + number, value); publishStatus("digit" + number, value);
} }
//===================================================================================================================================== //=====================================================================================================================================
@@ -301,7 +307,7 @@ void timeSet() {
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
jsonWriteStr(configLiveJson, "time" + number, value); jsonWriteStr(configLiveJson, "time" + number, value);
sendSTATUS("time" + number, value); publishStatus("time" + number, value);
} }
void handle_time_init() { void handle_time_init() {
@@ -341,7 +347,7 @@ void textSet() {
} }
jsonWriteStr(configLiveJson, "text" + number, text); jsonWriteStr(configLiveJson, "text" + number, text);
sendSTATUS("text" + number, text); publishStatus("text" + number, text);
} }
//===================================================================================================================================== //=====================================================================================================================================
//=========================================Модуль шагового мотора====================================================================== //=========================================Модуль шагового мотора======================================================================
@@ -496,23 +502,29 @@ void servoSet() {
eventGen("servo", servo_number); eventGen("servo", servo_number);
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state); jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
sendSTATUS("servo" + servo_number, servo_state);
publishStatus("servo" + servo_number, servo_state);
} }
#endif #endif
//====================================================================================================================================================
//===================================================================================serial===========================================================
#ifdef SERIAL_ENABLED #ifdef SERIAL_ENABLED
void serialBegin() { void serialBegin() {
//String s_speed = sCmd.next(); String s_speed = sCmd.next();
//String rxPin = sCmd.next(); String rxPin = sCmd.next();
//String txPin = sCmd.next(); String txPin = sCmd.next();
//SoftwareSerial mySerial(rxPin.toInt(), txPin.toInt());
//mySerial.begin(s_speed.toInt()); if (mySerial) {
delete mySerial;
}
mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt());
mySerial->begin(s_speed.toInt());
} }
void serialWrite() { void serialWrite() {
//String text = sCmd.next(); String payload = sCmd.next();
//mySerial.println(text); if (mySerial) {
mySerial->println(payload);
}
} }
#endif #endif
//==================================================================================================================================================== //====================================================================================================================================================
@@ -549,15 +561,14 @@ void firmwareVersion() {
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firmver"); choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firmver");
} }
//============================================================================================================================== //==============================================================================================================================
//============================выполнение команд (в лупе) по очереди из строки order============================================= //============================выполнение команд (в лупе) по очереди из строки order=============================================
void handleCMD_loop() { void loopCmd() {
if (order_loop != "") { if (order_loop != "") {
String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1, String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
sCmd.readStr(tmp); //выполняем первую команду sCmd.readStr(tmp); //выполняем
Serial.println("[ORDER] => " + order_loop); Serial.println("[ORDER] => " + order_loop);
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем выполненную команду order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
} }
} }

View File

@@ -11,12 +11,13 @@ int mqtt_lost_error = 0;
// Session params // Session params
String mqttPrefix; String mqttPrefix;
String mqttRootDevice;
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length); void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
const String getMqttStateStr(); const String getMqttStateStr();
void sendAllData(); void sendAllData();
void sendAllWigets(); void sendAllWigets();
boolean sendSTATUS(String topic, String state); boolean publicStatus(String topic, String state);
void outcoming_date(); void outcoming_date();
void initMQTT() { void initMQTT() {
@@ -43,7 +44,7 @@ void initMQTT() {
nullptr, true); nullptr, true);
} }
void do_mqtt_connection() { void reconnectMQTT() {
if (mqttParamsChanged) { if (mqttParamsChanged) {
mqtt.disconnect(); mqtt.disconnect();
connectMQTT(); connectMQTT();
@@ -63,12 +64,12 @@ void subscribe() {
// Для приема получения HELLOW и подтверждения связи // Для приема получения HELLOW и подтверждения связи
// Подписываемся на топики control // Подписываемся на топики control
// Подписываемся на топики order // Подписываемся на топики order
mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str()); mqtt.subscribe(mqttPrefix.c_str());
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/+/control").c_str()); mqtt.subscribe((mqttRootDevice + "/+/control").c_str());
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/order").c_str()); mqtt.subscribe((mqttRootDevice + "/order").c_str());
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/update").c_str()); mqtt.subscribe((mqttRootDevice + "/update").c_str());
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devc").c_str()); mqtt.subscribe((mqttRootDevice + "/devc").c_str());
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devs").c_str()); mqtt.subscribe((mqttRootDevice + "/devs").c_str());
} }
boolean connectMQTT() { boolean connectMQTT() {
@@ -77,15 +78,19 @@ boolean connectMQTT() {
} }
String addr = jsonReadStr(configSetupJson, "mqttServer"); 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) { if (!addr) {
pm.error("no broker address"); pm.error("no broker address");
return false; return false;
} }
int port = jsonReadInt(configSetupJson, "mqttPort");
String user = jsonReadStr(configSetupJson, "mqttUser");
String pass = jsonReadStr(configSetupJson, "mqttPass");
//Session params
mqttPrefix = jsonReadStr(configSetupJson, "mqttPrefix");
mqttRootDevice = mqttPrefix + "/" + chipId;
pm.info("broker " + addr + ":" + String(port, DEC)); pm.info("broker " + addr + ":" + String(port, DEC));
setLedStatus(LED_FAST); setLedStatus(LED_FAST);
mqtt.setServer(addr.c_str(), port); mqtt.setServer(addr.c_str(), port);
@@ -164,7 +169,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 = mqttPrefix + "/" + chipId + "/" + topic; String path = mqttRootDevice + "/" + topic;
if (!publish(path, data)) { if (!publish(path, data)) {
pm.error("on publish data"); pm.error("on publish data");
return false; return false;
@@ -173,7 +178,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 = mqttPrefix + "/" + chipId + "/" + topic + "/status"; String path = mqttRootDevice + "/" + topic + "/status";
if (!publish(path, data)) { if (!publish(path, data)) {
pm.error("on publish chart"); pm.error("on publish chart");
return false; return false;
@@ -187,15 +192,15 @@ boolean publishControl(String id, String topic, String state) {
} }
boolean sendCHART_test(String topic, String data) { boolean sendCHART_test(String topic, String data) {
topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status"; topic = mqttRootDevice + "/" + topic + "/status";
return mqtt.publish(topic.c_str(), data.c_str(), false); return mqtt.publish(topic.c_str(), data.c_str(), false);
} }
boolean sendSTATUS(String topic, String state) { boolean publishStatus(const String& topic, const String& data) {
topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status"; String path = mqttRootDevice + "/" + topic + "/status";
String json_ = "{}"; String json = "{}";
jsonWriteStr(json_, "status", state); jsonWriteStr(json, "status", data);
return mqtt.publish(topic.c_str(), json_.c_str(), false); return mqtt.publish(topic.c_str(), json.c_str(), false);
} }
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
@@ -239,23 +244,29 @@ void sendAllWigets() {
#endif #endif
//=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ========================================================
void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает
String current_config = configLiveJson; //{"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} void sendAllData() {
// берет строку json и ключи превращает в топики а значения колючей в них посылает
// {"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"}
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",
String current_config = configLiveJson;
printMemoryStatus("[I] after send all date"); printMemoryStatus("[I] after send all date");
current_config.replace("{", ""); current_config.replace("{", "");
current_config.replace("}", ""); //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1" current_config.replace("}", "");
current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1", current_config += ",";
while (current_config.length() != 0) { while (current_config.length()) {
String tmp = selectToMarker(current_config, ","); String tmp = selectToMarker(current_config, ",");
String topic = selectToMarker(tmp, ":"); String topic = selectToMarker(tmp, ":");
topic.replace("\"", ""); topic.replace("\"", "");
String state = selectToMarkerLast(tmp, ":"); String state = selectToMarkerLast(tmp, ":");
state.replace("\"", ""); state.replace("\"", "");
if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) { if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) {
sendSTATUS(topic, state); publishStatus(topic, state);
//Serial.println("-->" + topic + " " + state);
} }
current_config = deleteBeforeDelimiter(current_config, ","); current_config = deleteBeforeDelimiter(current_config, ",");
} }

View File

@@ -1,6 +1,6 @@
#include "Global.h" #include "Global.h"
void handleScenario() { void loopScenario() {
if (jsonReadStr(configSetupJson, "scen") == "1") { if (jsonReadStr(configSetupJson, "scen") == "1") {
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) { if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
int i = 0; int i = 0;
@@ -15,7 +15,6 @@ void handleScenario() {
i++; i++;
if (scenario_line_status[i] == 1) { if (scenario_line_status[i] == 1) {
//Serial.println(i);
String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
String param_name = selectFromMarkerToMarker(condition, " ", 0); String param_name = selectFromMarkerToMarker(condition, " ", 0);
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
@@ -72,24 +71,23 @@ void handleScenario() {
} }
} }
void eventGen(String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1 //событие выглядит как имя плюс set плюс номер: button+Set+1
void eventGen(String event_name, String number) {
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);
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 str) {
String num1 = param_name.substring(param_name.length() - 1); String num1 = str.substring(str.length() - 1);
String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1); String num2 = str.substring(str.length() - 2, str.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; str = str.substring(0, str.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; str = str.substring(0, str.length() - 1) + "Set" + num1;
} }
} }
return param_name; return str;
} }

View File

@@ -4,11 +4,11 @@ OneWire *oneWire;
GMedian<10, int> medianFilter; GMedian<10, int> medianFilter;
DHTesp dht; DHTesp dht;
Adafruit_BMP280 bmp; Adafruit_BMP280 bmp;
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor(); Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor(); Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
Adafruit_BME280 bme; Adafruit_BME280 bme;
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor(); Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
@@ -146,12 +146,12 @@ void ultrasonic_reading() {
jsonWriteInt(configLiveJson, levelPr_value_name, level); jsonWriteInt(configLiveJson, levelPr_value_name, level);
eventGen(levelPr_value_name, ""); eventGen(levelPr_value_name, "");
sendSTATUS(levelPr_value_name, String(level)); publishStatus(levelPr_value_name, String(level));
Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level)); Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level));
jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm); jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm);
eventGen(ultrasonicCm_value_name, ""); eventGen(ultrasonicCm_value_name, "");
sendSTATUS(ultrasonicCm_value_name, String(distance_cm)); publishStatus(ultrasonicCm_value_name, String(distance_cm));
Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm)); Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm));
} }
} }
@@ -201,7 +201,7 @@ void analog_reading1() {
jsonReadInt(configOptionJson, value_name + "_end_out")); jsonReadInt(configOptionJson, value_name + "_end_out"));
jsonWriteInt(configLiveJson, value_name, analog); jsonWriteInt(configLiveJson, value_name, analog);
eventGen(value_name, ""); eventGen(value_name, "");
sendSTATUS(value_name, String(analog)); publishStatus(value_name, String(analog));
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog)); Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
} }
@@ -220,7 +220,7 @@ void analog_reading2() {
jsonReadInt(configOptionJson, value_name + "_end_out")); jsonReadInt(configOptionJson, value_name + "_end_out"));
jsonWriteInt(configLiveJson, value_name, analog); jsonWriteInt(configLiveJson, value_name, analog);
eventGen(value_name, ""); eventGen(value_name, "");
sendSTATUS(value_name, String(analog)); publishStatus(value_name, String(analog));
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog)); Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
} }
#endif #endif
@@ -249,7 +249,7 @@ void dallas_reading() {
temp = sensors.getTempCByIndex(0); temp = sensors.getTempCByIndex(0);
jsonWriteStr(configLiveJson, "dallas", String(temp)); jsonWriteStr(configLiveJson, "dallas", String(temp));
eventGen("dallas", ""); eventGen("dallas", "");
sendSTATUS("dallas", String(temp)); publishStatus("dallas", String(temp));
Serial.println("[I] sensor 'dallas' send date " + String(temp)); Serial.println("[I] sensor 'dallas' send date " + String(temp));
} }
#endif #endif
@@ -280,7 +280,7 @@ void dhtT_reading() {
float value = 0; float value = 0;
static int counter; static int counter;
if (dht.getStatus() != 0 && counter < 5) { if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS(dhtT_value_name, String(dht.getStatusString())); publishStatus(dhtT_value_name, String(dht.getStatusString()));
counter++; counter++;
} else { } else {
counter = 0; counter = 0;
@@ -288,7 +288,7 @@ void dhtT_reading() {
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));
sendSTATUS(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));
} }
} }
@@ -318,7 +318,7 @@ void dhtH_reading() {
float value = 0; float value = 0;
static int counter; static int counter;
if (dht.getStatus() != 0 && counter < 5) { if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS(dhtH_value_name, String(dht.getStatusString())); publishStatus(dhtH_value_name, String(dht.getStatusString()));
counter++; counter++;
} else { } else {
counter = 0; counter = 0;
@@ -326,7 +326,7 @@ void dhtH_reading() {
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));
sendSTATUS(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));
} }
} }
@@ -344,13 +344,13 @@ void dhtP() {
void dhtP_reading() { void dhtP_reading() {
byte value; byte value;
if (dht.getStatus() != 0) { if (dht.getStatus() != 0) {
sendSTATUS("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 = perception(value); String final_line = perception(value);
jsonWriteStr(configLiveJson, "dhtPerception", final_line); jsonWriteStr(configLiveJson, "dhtPerception", final_line);
eventGen("dhtPerception", ""); eventGen("dhtPerception", "");
sendSTATUS("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);
} }
@@ -402,13 +402,13 @@ void dhtC() {
void dhtC_reading() { void dhtC_reading() {
ComfortState cf; ComfortState cf;
if (dht.getStatus() != 0) { if (dht.getStatus() != 0) {
sendSTATUS("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 = get_comfort_status(cf); String final_line = get_comfort_status(cf);
jsonWriteStr(configLiveJson, "dhtComfort", final_line); jsonWriteStr(configLiveJson, "dhtComfort", final_line);
eventGen("dhtComfort", ""); eventGen("dhtComfort", "");
sendSTATUS("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);
} }
} }
@@ -462,12 +462,12 @@ void dhtD() {
void dhtD_reading() { void dhtD_reading() {
float value; float value;
if (dht.getStatus() != 0) { if (dht.getStatus() != 0) {
sendSTATUS("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", "");
sendSTATUS("dhtDewpoint", String(value)); publishStatus("dhtDewpoint", String(value));
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value)); Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
} }
} }
@@ -503,7 +503,7 @@ void bmp280T_reading() {
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, "");
sendSTATUS(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));
} }
@@ -535,7 +535,7 @@ void bmp280P_reading() {
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, "");
sendSTATUS(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));
} }
@@ -560,7 +560,7 @@ void bme280T_reading() {
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, "");
sendSTATUS(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));
} }
@@ -584,7 +584,7 @@ void bme280P_reading() {
value = value / 1.333224; value = value / 1.333224;
jsonWriteStr(configLiveJson, bme280P_value_name, String(value)); jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
eventGen(bme280P_value_name, ""); eventGen(bme280P_value_name, "");
sendSTATUS(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));
} }
@@ -607,7 +607,7 @@ void bme280H_reading() {
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, "");
sendSTATUS(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));
} }
@@ -630,6 +630,6 @@ void bme280A_reading() {
value = bme.readAltitude(1013.25); value = bme.readAltitude(1013.25);
jsonWriteStr(configLiveJson, bme280A_value_name, String(value)); jsonWriteStr(configLiveJson, bme280A_value_name, String(value));
eventGen(bme280A_value_name, ""); eventGen(bme280A_value_name, "");
sendSTATUS(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

@@ -3,89 +3,89 @@
//================================================================================================================ //================================================================================================================
//=========================================Таймеры================================================================= //=========================================Таймеры=================================================================
void Timer_countdown_init() { void Timer_countdown_init() {
ts.add(
ts.add(TIMER_COUNTDOWN, 1000, [&](void*) { TIMER_COUNTDOWN, 1000, [&](void*) {
String old_line = jsonReadStr(configOptionJson, "timers");
String old_line = jsonReadStr(configOptionJson, "timers"); if (old_line != "") {
if (old_line != "") { //Serial.println(old_line);
//Serial.println(old_line); int i = 0;
int i = 0; do {
do { String timer = selectFromMarkerToMarker(old_line, ",", i);
String timer = selectFromMarkerToMarker(old_line, "," , i); Serial.print("timer no " + String(i) + ": ");
Serial.print("timer no " + String (i) + ": "); Serial.println(timer);
Serial.println(timer); if (timer == "not found" || timer == "") return;
if (timer == "not found" || timer == "") return; int number = selectToMarker(timer, ":").toInt();
int number = selectToMarker (timer, ":").toInt(); int time = readTimer(number);
int time = readTimer(number); if (time == 0) {
if (time == 0) { delTimer(String(number));
delTimer (String (number)); jsonWriteStr(configLiveJson, "timer" + String(number), "0");
jsonWriteStr(configLiveJson, "timer" + String(number), "0"); eventGen("timer", String(number));
eventGen ("timer", String(number)); } else {
} else { time--;
time--; addTimer(String(number), String(time));
addTimer(String (number), String (time)); }
} i++;
i++; } while (i <= 9);
} while (i <= 9); }
} },
}, nullptr, true); nullptr, true);
} }
void timerStart_() { void timerStart_() {
String number = sCmd.next(); String number = sCmd.next();
String period_of_time = sCmd.next(); String period_of_time = sCmd.next();
String type = sCmd.next(); String type = sCmd.next();
if (period_of_time.indexOf("digit") != -1) { if (period_of_time.indexOf("digit") != -1) {
//period_of_time = add_set(period_of_time); //period_of_time = add_set(period_of_time);
period_of_time = jsonReadStr(configLiveJson, period_of_time); period_of_time = jsonReadStr(configLiveJson, period_of_time);
} }
if (type == "sec") period_of_time = period_of_time; if (type == "sec") period_of_time = period_of_time;
if (type == "min") period_of_time = String(period_of_time.toInt() * 60); if (type == "min") period_of_time = String(period_of_time.toInt() * 60);
if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60);
addTimer(number, period_of_time); addTimer(number, period_of_time);
jsonWriteStr(configLiveJson, "timer" + number, "1"); jsonWriteStr(configLiveJson, "timer" + number, "1");
} }
void addTimer(String number, String time) { void addTimer(String number, String time) {
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
String new_timer = number + ":" + time; String new_timer = number + ":" + time;
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить
if (psn1 != -1) { //если он есть if (psn1 != -1) { //если он есть
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
tmp.replace(timer + ",", ""); tmp.replace(timer + ",", "");
tmp += new_timer + ","; tmp += new_timer + ",";
} else { //если его нет } else { //если его нет
tmp += new_timer + ","; tmp += new_timer + ",";
} }
jsonWriteStr(configOptionJson, "timers", tmp); jsonWriteStr(configOptionJson, "timers", tmp);
//Serial.println("ura"); //Serial.println("ura");
} }
void timerStop_() { void timerStop_() {
String number = sCmd.next(); String number = sCmd.next();
delTimer(number); delTimer(number);
} }
void delTimer (String number) { void delTimer(String number) {
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
if (psn1 != -1) { //если он есть if (psn1 != -1) { //если он есть
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить
tmp.replace(timer, ""); //удаляем таймер tmp.replace(timer, ""); //удаляем таймер
jsonWriteStr(configOptionJson, "timers", tmp); jsonWriteStr(configOptionJson, "timers", tmp);
} }
} }
int readTimer(int number) { int readTimer(int number) {
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать
String timer; String timer;
if (psn1 != -1) { //если он есть if (psn1 != -1) { //если он есть
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать
timer = deleteBeforeDelimiter(timer, ":"); timer = deleteBeforeDelimiter(timer, ":");
} }
return timer.toInt(); return timer.toInt();
} }

View File

@@ -55,25 +55,26 @@ String addFile(const String filename, const String str) {
} }
bool copyFile(const String src, const String dst, bool overwrite) { bool copyFile(const String src, const String dst, bool overwrite) {
String source = filepath(src); String srcPath = filepath(src);
String destination = filepath(dst); String dstPath = filepath(dst);
if (!LittleFS.exists(source)) { if (!LittleFS.exists(srcPath)) {
pm.error("source not exist: " + source); pm.error("not exist: " + srcPath);
return false; return false;
} }
if (LittleFS.exists(destination)) { if (LittleFS.exists(dstPath)) {
if (!overwrite) { if (!overwrite) {
pm.error("destination already exist: " + destination); pm.error("already exist: " + dstPath);
return false; return false;
} }
LittleFS.remove(destination); LittleFS.remove(dstPath);
} }
auto srcFile = LittleFS.open(source, "r"); auto srcFile = LittleFS.open(srcPath, "r");
auto dstFile = LittleFS.open(destination, "w"); auto dstFile = LittleFS.open(dstPath, "w");
static uint8_t buf[512]; uint8_t buf[512];
while (srcFile.read(buf, 512)) { while (srcFile.available()) {
dstFile.write(buf, 512); size_t len = srcFile.read(buf, 512);
dstFile.write(buf, len);
} }
srcFile.close(); srcFile.close();
dstFile.close(); dstFile.close();

55
src/Utils/PresetUtils.cpp Normal file
View File

@@ -0,0 +1,55 @@
#include "Utils/PresetUtils.h"
static const char* item_names[NUM_ITEMS] = {"relay", "pwm",
"dht11", "dht22", "analog",
"bmp280", "bme280", "dallas",
"termostat", "ultrasonic",
"motion", "stepper",
"servo", "firmware"};
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).c_str(), type == CT_MACRO ? "c" : "s");
return String(buf);
}
const String getItemName(Item_t item) {
return String(item_names[item]);
}
const Item_t getPresetItem(uint8_t num) {
Item_t res = NUM_ITEMS;
if (num >= 1 && num <= 7) {
res = RELAY;
} else if (num == 8) {
res = PWM;
} else if (num == 9) {
res = DHT11;
} else if (num == 10) {
res = DHT22;
} else if (num == 11) {
res = ANALOG;
} else if (num == 12) {
res = BMP280;
} else if (num == 13) {
res = BME280;
} else if (num == 14) {
res = DALLAS;
} else if (num == 15) {
res = TERMOSTAT;
} else if (num == 16) {
res = ULTRASONIC;
} else if (num >= 17 || num <= 18) {
res = MOTION;
} else if (num == 19) {
res = STEPPER;
} else if (num == 20) {
res = SERVO;
} else if (num == 21) {
res = FIRMWARE;
}
return res;
}

View File

@@ -1,5 +1,7 @@
#include "Global.h" #include "Global.h"
#include "Utils/PresetUtils.h"
static const char* MODULE = "Web"; static const char* MODULE = "Web";
static const uint8_t MIN_PRESET = 1; static const uint8_t MIN_PRESET = 1;
@@ -17,68 +19,13 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
return false; 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) {
uint8_t preset; uint8_t preset;
if (parseRequestForPreset(request, preset)) { if (parseRequestForPreset(request, preset)) {
String srcMacro = preset == 21 ? "configs/firmware.c.txt" : getPresetFile(preset, CT_MACRO); 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 srcScenario = preset == 21 ? "configs/firmware.s.txt" : getPresetFile(preset, CT_SCENARIO);
pm.info("activate " + srcMacro); pm.info("activate " + getItemName(getPresetItem(preset)));
pm.info("activate " + srcScenario);
copyFile(srcMacro, "firmware.c.txt"); copyFile(srcMacro, "firmware.c.txt");
copyFile(srcScenario, "firmware.s.txt"); copyFile(srcScenario, "firmware.s.txt");

View File

@@ -86,17 +86,17 @@ void loop() {
not_async_actions(); not_async_actions();
loopMQTT(); loopMQTT();
handleCMD_loop(); loopCmd();
handleButton(); loopButton();
handleScenario(); loopScenario();
#ifdef UDP_ENABLED #ifdef UDP_ENABLED
handleUdp(); loopUdp();
#endif #endif
ts.update(); ts.update();
} }
void not_async_actions() { void not_async_actions() {
do_mqtt_connection(); reconnectMQTT();
do_upgrade_url(); do_upgrade_url();
do_upgrade(); do_upgrade();
@@ -123,15 +123,13 @@ String getURL(const String& urls) {
} }
void safeDataToFile(String data, String Folder) { void safeDataToFile(String data, String Folder) {
//String fileName = GetDate();
String fileName; String fileName;
fileName.toLowerCase(); fileName.toLowerCase();
fileName = deleteBeforeDelimiter(fileName, " "); fileName = deleteBeforeDelimiter(fileName, " ");
fileName.replace(" ", "."); fileName.replace(" ", ".");
fileName.replace("..", "."); fileName.replace("..", ".");
fileName = Folder + "/" + fileName + ".txt"; fileName = Folder + "/" + fileName + ".txt";
// addFile(fileName, GetTime() + "/" + data);
Serial.println(fileName);
jsonWriteStr(configLiveJson, "test", fileName); jsonWriteStr(configLiveJson, "test", fileName);
} }

View File

@@ -54,7 +54,7 @@ void UDP_init() {
nullptr, false); nullptr, false);
} }
void handleUdp() { void loopUdp() {
#ifdef ESP8266 #ifdef ESP8266
if (jsonReadStr(configSetupJson, "udponoff") == "1") { if (jsonReadStr(configSetupJson, "udponoff") == "1") {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {