mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
SoftwareSerial
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "Utils\WiFiUtils.h"
|
||||
|
||||
//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК===============
|
||||
#include <SoftwareSerial.h>
|
||||
#include <Adafruit_BME280.h>
|
||||
#include <Adafruit_BMP280.h>
|
||||
#include <Bounce2.h>
|
||||
@@ -62,7 +63,7 @@ extern AsyncWebServer server;
|
||||
extern DallasTemperature sensors;
|
||||
|
||||
extern boolean but[NUM_BUTTONS];
|
||||
extern Bounce *buttons;
|
||||
extern Bounce* buttons;
|
||||
|
||||
/*
|
||||
* Global vars
|
||||
@@ -205,11 +206,10 @@ extern boolean connectMQTT();
|
||||
|
||||
extern boolean publishData(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 sendSTATUS(String topic, String state);
|
||||
|
||||
extern void do_mqtt_connection();
|
||||
extern void reconnectMQTT();
|
||||
|
||||
//Scenario
|
||||
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();
|
||||
|
||||
// iot_firmware
|
||||
extern void handleCMD_loop();
|
||||
extern void handleButton();
|
||||
extern void handleScenario();
|
||||
extern void handleUdp();
|
||||
extern void loopCmd();
|
||||
extern void loopButton();
|
||||
extern void loopScenario();
|
||||
extern void loopUdp();
|
||||
extern void do_upgrade_url();
|
||||
extern void do_upgrade();
|
||||
|
||||
|
||||
11
include/Utils/PresetUtils.h
Normal file
11
include/Utils/PresetUtils.h
Normal 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);
|
||||
57
src/Cmd.cpp
57
src/Cmd.cpp
@@ -5,6 +5,7 @@ Bounce *buttons = new Bounce[NUM_BUTTONS];
|
||||
|
||||
Servo myServo1;
|
||||
Servo myServo2;
|
||||
SoftwareSerial *mySerial = nullptr;
|
||||
|
||||
void CMD_init() {
|
||||
sCmd.addCommand("button", button);
|
||||
@@ -165,12 +166,14 @@ void buttonSet() {
|
||||
eventGen("button", button_number);
|
||||
|
||||
jsonWriteStr(configLiveJson, "button" + button_number, button_state);
|
||||
sendSTATUS("button" + button_number, button_state);
|
||||
|
||||
publishStatus("button" + button_number, button_state);
|
||||
}
|
||||
|
||||
void buttonChange() {
|
||||
String button_number = sCmd.next();
|
||||
String current_state = jsonReadStr(configLiveJson, "button" + button_number);
|
||||
|
||||
if (current_state == "1") {
|
||||
current_state = "0";
|
||||
} else if (current_state == "0") {
|
||||
@@ -178,7 +181,7 @@ void buttonChange() {
|
||||
}
|
||||
order_loop += "buttonSet " + 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() {
|
||||
@@ -226,7 +229,8 @@ void pwmSet() {
|
||||
eventGen("pwm", pwm_number);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void handleButton() {
|
||||
void loopButton() {
|
||||
static uint8_t switch_number = 1;
|
||||
|
||||
if (but[switch_number]) {
|
||||
@@ -257,7 +261,9 @@ void handleButton() {
|
||||
}
|
||||
}
|
||||
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 value = sCmd.next();
|
||||
jsonWriteStr(configLiveJson, "digit" + number, value);
|
||||
sendSTATUS("digit" + number, value);
|
||||
publishStatus("digit" + number, value);
|
||||
}
|
||||
|
||||
//=====================================================================================================================================
|
||||
@@ -301,7 +307,7 @@ void timeSet() {
|
||||
String number = sCmd.next();
|
||||
String value = sCmd.next();
|
||||
jsonWriteStr(configLiveJson, "time" + number, value);
|
||||
sendSTATUS("time" + number, value);
|
||||
publishStatus("time" + number, value);
|
||||
}
|
||||
|
||||
void handle_time_init() {
|
||||
@@ -341,7 +347,7 @@ void textSet() {
|
||||
}
|
||||
|
||||
jsonWriteStr(configLiveJson, "text" + number, text);
|
||||
sendSTATUS("text" + number, text);
|
||||
publishStatus("text" + number, text);
|
||||
}
|
||||
//=====================================================================================================================================
|
||||
//=========================================Модуль шагового мотора======================================================================
|
||||
@@ -496,23 +502,29 @@ void servoSet() {
|
||||
eventGen("servo", servo_number);
|
||||
|
||||
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
|
||||
sendSTATUS("servo" + servo_number, servo_state);
|
||||
|
||||
publishStatus("servo" + servo_number, servo_state);
|
||||
}
|
||||
#endif
|
||||
//====================================================================================================================================================
|
||||
//===================================================================================serial===========================================================
|
||||
|
||||
#ifdef SERIAL_ENABLED
|
||||
void serialBegin() {
|
||||
//String s_speed = sCmd.next();
|
||||
//String rxPin = sCmd.next();
|
||||
//String txPin = sCmd.next();
|
||||
//SoftwareSerial mySerial(rxPin.toInt(), txPin.toInt());
|
||||
//mySerial.begin(s_speed.toInt());
|
||||
String s_speed = sCmd.next();
|
||||
String rxPin = sCmd.next();
|
||||
String txPin = sCmd.next();
|
||||
|
||||
if (mySerial) {
|
||||
delete mySerial;
|
||||
}
|
||||
mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt());
|
||||
mySerial->begin(s_speed.toInt());
|
||||
}
|
||||
|
||||
void serialWrite() {
|
||||
//String text = sCmd.next();
|
||||
//mySerial.println(text);
|
||||
String payload = sCmd.next();
|
||||
if (mySerial) {
|
||||
mySerial->println(payload);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//====================================================================================================================================================
|
||||
@@ -549,15 +561,14 @@ void firmwareVersion() {
|
||||
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firmver");
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================================================================
|
||||
//============================выполнение команд (в лупе) по очереди из строки order=============================================
|
||||
void handleCMD_loop() {
|
||||
void loopCmd() {
|
||||
if (order_loop != "") {
|
||||
String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1,
|
||||
sCmd.readStr(tmp); //выполняем первую команду
|
||||
String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
|
||||
sCmd.readStr(tmp); //выполняем
|
||||
Serial.println("[ORDER] => " + order_loop);
|
||||
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем выполненную команду
|
||||
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
67
src/Mqtt.cpp
67
src/Mqtt.cpp
@@ -11,12 +11,13 @@ int mqtt_lost_error = 0;
|
||||
|
||||
// Session params
|
||||
String mqttPrefix;
|
||||
String mqttRootDevice;
|
||||
|
||||
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
|
||||
const String getMqttStateStr();
|
||||
void sendAllData();
|
||||
void sendAllWigets();
|
||||
boolean sendSTATUS(String topic, String state);
|
||||
boolean publicStatus(String topic, String state);
|
||||
void outcoming_date();
|
||||
|
||||
void initMQTT() {
|
||||
@@ -43,7 +44,7 @@ void initMQTT() {
|
||||
nullptr, true);
|
||||
}
|
||||
|
||||
void do_mqtt_connection() {
|
||||
void reconnectMQTT() {
|
||||
if (mqttParamsChanged) {
|
||||
mqtt.disconnect();
|
||||
connectMQTT();
|
||||
@@ -63,12 +64,12 @@ void 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());
|
||||
mqtt.subscribe(mqttPrefix.c_str());
|
||||
mqtt.subscribe((mqttRootDevice + "/+/control").c_str());
|
||||
mqtt.subscribe((mqttRootDevice + "/order").c_str());
|
||||
mqtt.subscribe((mqttRootDevice + "/update").c_str());
|
||||
mqtt.subscribe((mqttRootDevice + "/devc").c_str());
|
||||
mqtt.subscribe((mqttRootDevice + "/devs").c_str());
|
||||
}
|
||||
|
||||
boolean connectMQTT() {
|
||||
@@ -77,15 +78,19 @@ boolean connectMQTT() {
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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));
|
||||
setLedStatus(LED_FAST);
|
||||
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) {
|
||||
String path = mqttPrefix + "/" + chipId + "/" + topic;
|
||||
String path = mqttRootDevice + "/" + topic;
|
||||
if (!publish(path, data)) {
|
||||
pm.error("on publish data");
|
||||
return false;
|
||||
@@ -173,7 +178,7 @@ boolean publishData(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)) {
|
||||
pm.error("on publish chart");
|
||||
return false;
|
||||
@@ -187,15 +192,15 @@ boolean publishControl(String id, String topic, String state) {
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
boolean sendSTATUS(String topic, String state) {
|
||||
topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status";
|
||||
String json_ = "{}";
|
||||
jsonWriteStr(json_, "status", state);
|
||||
return mqtt.publish(topic.c_str(), json_.c_str(), false);
|
||||
boolean publishStatus(const String& topic, const String& data) {
|
||||
String path = mqttRootDevice + "/" + topic + "/status";
|
||||
String json = "{}";
|
||||
jsonWriteStr(json, "status", data);
|
||||
return mqtt.publish(topic.c_str(), json.c_str(), false);
|
||||
}
|
||||
|
||||
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
|
||||
@@ -239,23 +244,29 @@ void sendAllWigets() {
|
||||
#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");
|
||||
current_config.replace("{", "");
|
||||
current_config.replace("}", ""); //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
|
||||
current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",
|
||||
current_config.replace("}", "");
|
||||
current_config += ",";
|
||||
|
||||
while (current_config.length() != 0) {
|
||||
while (current_config.length()) {
|
||||
String tmp = selectToMarker(current_config, ",");
|
||||
|
||||
String topic = selectToMarker(tmp, ":");
|
||||
topic.replace("\"", "");
|
||||
|
||||
String state = selectToMarkerLast(tmp, ":");
|
||||
state.replace("\"", "");
|
||||
|
||||
if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) {
|
||||
sendSTATUS(topic, state);
|
||||
//Serial.println("-->" + topic + " " + state);
|
||||
publishStatus(topic, state);
|
||||
}
|
||||
current_config = deleteBeforeDelimiter(current_config, ",");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "Global.h"
|
||||
|
||||
void handleScenario() {
|
||||
void loopScenario() {
|
||||
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
|
||||
int i = 0;
|
||||
@@ -15,7 +15,6 @@ void handleScenario() {
|
||||
i++;
|
||||
|
||||
if (scenario_line_status[i] == 1) {
|
||||
//Serial.println(i);
|
||||
String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
|
||||
String param_name = selectFromMarkerToMarker(condition, " ", 0);
|
||||
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") {
|
||||
String tmp = jsonReadStr(configOptionJson, "scenario_status"); //генерирование события
|
||||
//Serial.println(event_name);
|
||||
jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ",");
|
||||
}
|
||||
}
|
||||
|
||||
String add_set(String param_name) {
|
||||
String num1 = param_name.substring(param_name.length() - 1);
|
||||
String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1);
|
||||
String add_set(String str) {
|
||||
String num1 = str.substring(str.length() - 1);
|
||||
String num2 = str.substring(str.length() - 2, str.length() - 1);
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
@@ -4,11 +4,11 @@ OneWire *oneWire;
|
||||
GMedian<10, int> medianFilter;
|
||||
DHTesp dht;
|
||||
|
||||
Adafruit_BMP280 bmp;
|
||||
Adafruit_BMP280 bmp;
|
||||
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
|
||||
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
|
||||
|
||||
Adafruit_BME280 bme;
|
||||
Adafruit_BME280 bme;
|
||||
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
|
||||
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
|
||||
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
|
||||
@@ -146,12 +146,12 @@ void ultrasonic_reading() {
|
||||
|
||||
jsonWriteInt(configLiveJson, levelPr_value_name, level);
|
||||
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));
|
||||
|
||||
jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm);
|
||||
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));
|
||||
}
|
||||
}
|
||||
@@ -201,7 +201,7 @@ void analog_reading1() {
|
||||
jsonReadInt(configOptionJson, value_name + "_end_out"));
|
||||
jsonWriteInt(configLiveJson, value_name, analog);
|
||||
eventGen(value_name, "");
|
||||
sendSTATUS(value_name, String(analog));
|
||||
publishStatus(value_name, String(analog));
|
||||
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ void analog_reading2() {
|
||||
jsonReadInt(configOptionJson, value_name + "_end_out"));
|
||||
jsonWriteInt(configLiveJson, value_name, analog);
|
||||
eventGen(value_name, "");
|
||||
sendSTATUS(value_name, String(analog));
|
||||
publishStatus(value_name, String(analog));
|
||||
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
|
||||
}
|
||||
#endif
|
||||
@@ -249,7 +249,7 @@ void dallas_reading() {
|
||||
temp = sensors.getTempCByIndex(0);
|
||||
jsonWriteStr(configLiveJson, "dallas", String(temp));
|
||||
eventGen("dallas", "");
|
||||
sendSTATUS("dallas", String(temp));
|
||||
publishStatus("dallas", String(temp));
|
||||
Serial.println("[I] sensor 'dallas' send date " + String(temp));
|
||||
}
|
||||
#endif
|
||||
@@ -280,7 +280,7 @@ void dhtT_reading() {
|
||||
float value = 0;
|
||||
static int counter;
|
||||
if (dht.getStatus() != 0 && counter < 5) {
|
||||
sendSTATUS(dhtT_value_name, String(dht.getStatusString()));
|
||||
publishStatus(dhtT_value_name, String(dht.getStatusString()));
|
||||
counter++;
|
||||
} else {
|
||||
counter = 0;
|
||||
@@ -288,7 +288,7 @@ void dhtT_reading() {
|
||||
if (String(value) != "nan") {
|
||||
eventGen(dhtT_value_name, "");
|
||||
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));
|
||||
}
|
||||
}
|
||||
@@ -318,7 +318,7 @@ void dhtH_reading() {
|
||||
float value = 0;
|
||||
static int counter;
|
||||
if (dht.getStatus() != 0 && counter < 5) {
|
||||
sendSTATUS(dhtH_value_name, String(dht.getStatusString()));
|
||||
publishStatus(dhtH_value_name, String(dht.getStatusString()));
|
||||
counter++;
|
||||
} else {
|
||||
counter = 0;
|
||||
@@ -326,7 +326,7 @@ void dhtH_reading() {
|
||||
if (String(value) != "nan") {
|
||||
eventGen(dhtH_value_name, "");
|
||||
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));
|
||||
}
|
||||
}
|
||||
@@ -344,13 +344,13 @@ void dhtP() {
|
||||
void dhtP_reading() {
|
||||
byte value;
|
||||
if (dht.getStatus() != 0) {
|
||||
sendSTATUS("dhtPerception", String(dht.getStatusString()));
|
||||
publishStatus("dhtPerception", String(dht.getStatusString()));
|
||||
} else {
|
||||
value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||
String final_line = perception(value);
|
||||
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
||||
eventGen("dhtPerception", "");
|
||||
sendSTATUS("dhtPerception", final_line);
|
||||
publishStatus("dhtPerception", final_line);
|
||||
if (mqtt.connected()) {
|
||||
Serial.println("[I] sensor 'dhtPerception' data: " + final_line);
|
||||
}
|
||||
@@ -402,13 +402,13 @@ void dhtC() {
|
||||
void dhtC_reading() {
|
||||
ComfortState cf;
|
||||
if (dht.getStatus() != 0) {
|
||||
sendSTATUS("dhtComfort", String(dht.getStatusString()));
|
||||
publishStatus("dhtComfort", String(dht.getStatusString()));
|
||||
} else {
|
||||
dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||
String final_line = get_comfort_status(cf);
|
||||
jsonWriteStr(configLiveJson, "dhtComfort", final_line);
|
||||
eventGen("dhtComfort", "");
|
||||
sendSTATUS("dhtComfort", final_line);
|
||||
publishStatus("dhtComfort", final_line);
|
||||
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
|
||||
}
|
||||
}
|
||||
@@ -462,12 +462,12 @@ void dhtD() {
|
||||
void dhtD_reading() {
|
||||
float value;
|
||||
if (dht.getStatus() != 0) {
|
||||
sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
|
||||
publishStatus("dhtDewpoint", String(dht.getStatusString()));
|
||||
} else {
|
||||
value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||
jsonWriteInt(configLiveJson, "dhtDewpoint", value);
|
||||
eventGen("dhtDewpoint", "");
|
||||
sendSTATUS("dhtDewpoint", String(value));
|
||||
publishStatus("dhtDewpoint", String(value));
|
||||
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
|
||||
}
|
||||
}
|
||||
@@ -503,7 +503,7 @@ void bmp280T_reading() {
|
||||
value = temp_event.temperature;
|
||||
jsonWriteStr(configLiveJson, bmp280T_value_name, String(value));
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -535,7 +535,7 @@ void bmp280P_reading() {
|
||||
value = value / 1.333224;
|
||||
jsonWriteStr(configLiveJson, bmp280P_value_name, String(value));
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -560,7 +560,7 @@ void bme280T_reading() {
|
||||
value = bme.readTemperature();
|
||||
jsonWriteStr(configLiveJson, bme280T_value_name, String(value));
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -584,7 +584,7 @@ void bme280P_reading() {
|
||||
value = value / 1.333224;
|
||||
jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -607,7 +607,7 @@ void bme280H_reading() {
|
||||
value = bme.readHumidity();
|
||||
jsonWriteStr(configLiveJson, bme280H_value_name, String(value));
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -630,6 +630,6 @@ void bme280A_reading() {
|
||||
value = bme.readAltitude(1013.25);
|
||||
jsonWriteStr(configLiveJson, bme280A_value_name, String(value));
|
||||
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));
|
||||
}
|
||||
|
||||
144
src/Timers.cpp
144
src/Timers.cpp
@@ -3,89 +3,89 @@
|
||||
//================================================================================================================
|
||||
//=========================================Таймеры=================================================================
|
||||
void Timer_countdown_init() {
|
||||
|
||||
ts.add(TIMER_COUNTDOWN, 1000, [&](void*) {
|
||||
|
||||
String old_line = jsonReadStr(configOptionJson, "timers");
|
||||
if (old_line != "") {
|
||||
//Serial.println(old_line);
|
||||
int i = 0;
|
||||
do {
|
||||
String timer = selectFromMarkerToMarker(old_line, "," , i);
|
||||
Serial.print("timer no " + String (i) + ": ");
|
||||
Serial.println(timer);
|
||||
if (timer == "not found" || timer == "") return;
|
||||
int number = selectToMarker (timer, ":").toInt();
|
||||
int time = readTimer(number);
|
||||
if (time == 0) {
|
||||
delTimer (String (number));
|
||||
jsonWriteStr(configLiveJson, "timer" + String(number), "0");
|
||||
eventGen ("timer", String(number));
|
||||
} else {
|
||||
time--;
|
||||
addTimer(String (number), String (time));
|
||||
}
|
||||
i++;
|
||||
} while (i <= 9);
|
||||
}
|
||||
}, nullptr, true);
|
||||
ts.add(
|
||||
TIMER_COUNTDOWN, 1000, [&](void*) {
|
||||
String old_line = jsonReadStr(configOptionJson, "timers");
|
||||
if (old_line != "") {
|
||||
//Serial.println(old_line);
|
||||
int i = 0;
|
||||
do {
|
||||
String timer = selectFromMarkerToMarker(old_line, ",", i);
|
||||
Serial.print("timer no " + String(i) + ": ");
|
||||
Serial.println(timer);
|
||||
if (timer == "not found" || timer == "") return;
|
||||
int number = selectToMarker(timer, ":").toInt();
|
||||
int time = readTimer(number);
|
||||
if (time == 0) {
|
||||
delTimer(String(number));
|
||||
jsonWriteStr(configLiveJson, "timer" + String(number), "0");
|
||||
eventGen("timer", String(number));
|
||||
} else {
|
||||
time--;
|
||||
addTimer(String(number), String(time));
|
||||
}
|
||||
i++;
|
||||
} while (i <= 9);
|
||||
}
|
||||
},
|
||||
nullptr, true);
|
||||
}
|
||||
|
||||
void timerStart_() {
|
||||
String number = sCmd.next();
|
||||
String period_of_time = sCmd.next();
|
||||
String type = sCmd.next();
|
||||
if (period_of_time.indexOf("digit") != -1) {
|
||||
//period_of_time = add_set(period_of_time);
|
||||
period_of_time = jsonReadStr(configLiveJson, 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 == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60);
|
||||
addTimer(number, period_of_time);
|
||||
jsonWriteStr(configLiveJson, "timer" + number, "1");
|
||||
String number = sCmd.next();
|
||||
String period_of_time = sCmd.next();
|
||||
String type = sCmd.next();
|
||||
if (period_of_time.indexOf("digit") != -1) {
|
||||
//period_of_time = add_set(period_of_time);
|
||||
period_of_time = jsonReadStr(configLiveJson, 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 == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60);
|
||||
addTimer(number, period_of_time);
|
||||
jsonWriteStr(configLiveJson, "timer" + number, "1");
|
||||
}
|
||||
void addTimer(String number, String time) {
|
||||
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||
String new_timer = number + ":" + time;
|
||||
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить
|
||||
if (psn1 != -1) { //если он есть
|
||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||
String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить
|
||||
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
|
||||
tmp.replace(timer + ",", "");
|
||||
tmp += new_timer + ",";
|
||||
} else { //если его нет
|
||||
tmp += new_timer + ",";
|
||||
}
|
||||
jsonWriteStr(configOptionJson, "timers", tmp);
|
||||
//Serial.println("ura");
|
||||
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||
String new_timer = number + ":" + time;
|
||||
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить
|
||||
if (psn1 != -1) { //если он есть
|
||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||
String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить
|
||||
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
|
||||
tmp.replace(timer + ",", "");
|
||||
tmp += new_timer + ",";
|
||||
} else { //если его нет
|
||||
tmp += new_timer + ",";
|
||||
}
|
||||
jsonWriteStr(configOptionJson, "timers", tmp);
|
||||
//Serial.println("ura");
|
||||
}
|
||||
|
||||
void timerStop_() {
|
||||
String number = sCmd.next();
|
||||
delTimer(number);
|
||||
String number = sCmd.next();
|
||||
delTimer(number);
|
||||
}
|
||||
|
||||
void delTimer (String number) {
|
||||
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
|
||||
if (psn1 != -1) { //если он есть
|
||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||
String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить
|
||||
tmp.replace(timer, ""); //удаляем таймер
|
||||
jsonWriteStr(configOptionJson, "timers", tmp);
|
||||
}
|
||||
void delTimer(String number) {
|
||||
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
|
||||
if (psn1 != -1) { //если он есть
|
||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||
String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить
|
||||
tmp.replace(timer, ""); //удаляем таймер
|
||||
jsonWriteStr(configOptionJson, "timers", tmp);
|
||||
}
|
||||
}
|
||||
|
||||
int readTimer(int number) {
|
||||
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||
int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать
|
||||
String timer;
|
||||
if (psn1 != -1) { //если он есть
|
||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||
timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать
|
||||
timer = deleteBeforeDelimiter(timer, ":");
|
||||
}
|
||||
return timer.toInt();
|
||||
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||
int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать
|
||||
String timer;
|
||||
if (psn1 != -1) { //если он есть
|
||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||
timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать
|
||||
timer = deleteBeforeDelimiter(timer, ":");
|
||||
}
|
||||
return timer.toInt();
|
||||
}
|
||||
@@ -55,25 +55,26 @@ String addFile(const String filename, const String str) {
|
||||
}
|
||||
|
||||
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);
|
||||
String srcPath = filepath(src);
|
||||
String dstPath = filepath(dst);
|
||||
if (!LittleFS.exists(srcPath)) {
|
||||
pm.error("not exist: " + srcPath);
|
||||
return false;
|
||||
}
|
||||
if (LittleFS.exists(destination)) {
|
||||
if (LittleFS.exists(dstPath)) {
|
||||
if (!overwrite) {
|
||||
pm.error("destination already exist: " + destination);
|
||||
pm.error("already exist: " + dstPath);
|
||||
return false;
|
||||
}
|
||||
LittleFS.remove(destination);
|
||||
LittleFS.remove(dstPath);
|
||||
}
|
||||
auto srcFile = LittleFS.open(source, "r");
|
||||
auto dstFile = LittleFS.open(destination, "w");
|
||||
auto srcFile = LittleFS.open(srcPath, "r");
|
||||
auto dstFile = LittleFS.open(dstPath, "w");
|
||||
|
||||
static uint8_t buf[512];
|
||||
while (srcFile.read(buf, 512)) {
|
||||
dstFile.write(buf, 512);
|
||||
uint8_t buf[512];
|
||||
while (srcFile.available()) {
|
||||
size_t len = srcFile.read(buf, 512);
|
||||
dstFile.write(buf, len);
|
||||
}
|
||||
srcFile.close();
|
||||
dstFile.close();
|
||||
|
||||
55
src/Utils/PresetUtils.cpp
Normal file
55
src/Utils/PresetUtils.cpp
Normal 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;
|
||||
}
|
||||
59
src/Web.cpp
59
src/Web.cpp
@@ -1,5 +1,7 @@
|
||||
#include "Global.h"
|
||||
|
||||
#include "Utils/PresetUtils.h"
|
||||
|
||||
static const char* MODULE = "Web";
|
||||
|
||||
static const uint8_t MIN_PRESET = 1;
|
||||
@@ -17,68 +19,13 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& 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() {
|
||||
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
uint8_t preset;
|
||||
if (parseRequestForPreset(request, 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);
|
||||
pm.info("activate " + srcMacro);
|
||||
pm.info("activate " + srcScenario);
|
||||
pm.info("activate " + getItemName(getPresetItem(preset)));
|
||||
copyFile(srcMacro, "firmware.c.txt");
|
||||
copyFile(srcScenario, "firmware.s.txt");
|
||||
|
||||
|
||||
14
src/main.cpp
14
src/main.cpp
@@ -86,17 +86,17 @@ void loop() {
|
||||
not_async_actions();
|
||||
|
||||
loopMQTT();
|
||||
handleCMD_loop();
|
||||
handleButton();
|
||||
handleScenario();
|
||||
loopCmd();
|
||||
loopButton();
|
||||
loopScenario();
|
||||
#ifdef UDP_ENABLED
|
||||
handleUdp();
|
||||
loopUdp();
|
||||
#endif
|
||||
ts.update();
|
||||
}
|
||||
|
||||
void not_async_actions() {
|
||||
do_mqtt_connection();
|
||||
reconnectMQTT();
|
||||
do_upgrade_url();
|
||||
do_upgrade();
|
||||
|
||||
@@ -123,15 +123,13 @@ String getURL(const String& urls) {
|
||||
}
|
||||
|
||||
void safeDataToFile(String data, String Folder) {
|
||||
//String fileName = GetDate();
|
||||
String fileName;
|
||||
fileName.toLowerCase();
|
||||
fileName = deleteBeforeDelimiter(fileName, " ");
|
||||
fileName.replace(" ", ".");
|
||||
fileName.replace("..", ".");
|
||||
fileName = Folder + "/" + fileName + ".txt";
|
||||
// addFile(fileName, GetTime() + "/" + data);
|
||||
Serial.println(fileName);
|
||||
|
||||
jsonWriteStr(configLiveJson, "test", fileName);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ void UDP_init() {
|
||||
nullptr, false);
|
||||
}
|
||||
|
||||
void handleUdp() {
|
||||
void loopUdp() {
|
||||
#ifdef ESP8266
|
||||
if (jsonReadStr(configSetupJson, "udponoff") == "1") {
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
|
||||
Reference in New Issue
Block a user