mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 11:59:12 +03:00
0
data/configs/021c.txt
Normal file
0
data/configs/021c.txt
Normal file
0
data/configs/021s.txt
Normal file
0
data/configs/021s.txt
Normal file
@@ -55,27 +55,28 @@
|
|||||||
"style": "display:inline",
|
"style": "display:inline",
|
||||||
"title": {
|
"title": {
|
||||||
"#": "{{SetDevPreset}}<span class=\"caret\"></span>",
|
"#": "{{SetDevPreset}}<span class=\"caret\"></span>",
|
||||||
"/set?preset=1": "1.Вкл. выкл. локального реле",
|
"/set?preset=001": "1.Вкл. выкл. локального реле",
|
||||||
"/set?preset=2": "2.Вкл. выкл. локального реле в определенное время",
|
"/set?preset=002": "2.Вкл. выкл. локального реле в определенное время",
|
||||||
"/set?preset=3": "3.Вкл. выкл. локального реле на определенный период времени",
|
"/set?preset=003": "3.Вкл. выкл. локального реле на определенный период времени",
|
||||||
"/set?preset=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
"/set?preset=004": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
||||||
"/set?preset=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
|
"/set?preset=005": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
|
||||||
"/set?preset=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
"/set?preset=006": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
||||||
"/set?preset=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
"/set?preset=007": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
||||||
"/set?preset=8": "8.Широтно импульсная модуляция",
|
"/set?preset=008": "8.Широтно импульсная модуляция",
|
||||||
"/set?preset=9": "9.Сенсор DHT11 (темп, влажность) и логгирование",
|
"/set?preset=009": "9.Сенсор DHT11 (темп, влажность) и логгирование",
|
||||||
"/set?preset=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
|
"/set?preset=010": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
|
||||||
"/set?preset=11": "11.Аналоговый сенсор и логгирование",
|
"/set?preset=011": "11.Аналоговый сенсор и логгирование",
|
||||||
"/set?preset=12": "12.Cенсор bmp280 (темп, давление) и логгирование",
|
"/set?preset=012": "12.Cенсор bmp280 (темп, давление) и логгирование",
|
||||||
"/set?preset=13": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
|
"/set?preset=013": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
|
||||||
"/set?preset=14": "12.Сенсор DS18B20 (темп) и логгирование",
|
"/set?preset=014": "14.Сенсор DS18B20 (темп) и логгирование",
|
||||||
"/set?preset=15": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
|
"/set?preset=015": "15.Термостат на DS18B20 с переключением в ручной режим и логгированием",
|
||||||
"/set?preset=16": "14.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
|
"/set?preset=016": "16.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
|
||||||
"/set?preset=17": "15.Датчик движения включающий свет",
|
"/set?preset=017": "17.Датчик движения включающий свет",
|
||||||
"/set?preset=18": "16.Охранный датчик движения",
|
"/set?preset=018": "18.Охранный датчик движения",
|
||||||
"/set?preset=19": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
"/set?preset=019": "19.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
||||||
"/set?preset=20": "18.Система управления сервоприводами",
|
"/set?preset=020": "20.Система управления сервоприводами",
|
||||||
"/set?preset=21": "Настройки по умолчанию"
|
"/set?preset=021": "21.Модуль uart (serial). Двухстороняя связь с устройством через uart. Получение данных и отправка команд",
|
||||||
|
"/set?preset=100": "22.Настройки по умолчанию"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -84,7 +85,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"state": "firmware.c.txt",
|
"state": "100с.txt",
|
||||||
"style": "width:100%;height:350px",
|
"style": "width:100%;height:350px",
|
||||||
"title": "Сохранить",
|
"title": "Сохранить",
|
||||||
"action": "/set?devinit",
|
"action": "/set?devinit",
|
||||||
@@ -103,7 +104,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"state": "firmware.s.txt",
|
"state": "100s.txt",
|
||||||
"style": "width:100%;height:350px",
|
"style": "width:100%;height:350px",
|
||||||
"title": "Сохранить",
|
"title": "Сохранить",
|
||||||
"action": "/set?sceninit",
|
"action": "/set?sceninit",
|
||||||
|
|||||||
22
include/CaptiveRequestHandler.h
Normal file
22
include/CaptiveRequestHandler.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AsyncWebSocket.h>
|
||||||
|
|
||||||
|
class CaptiveRequestHandler : public AsyncWebHandler {
|
||||||
|
public:
|
||||||
|
CaptiveRequestHandler(const char *host);
|
||||||
|
|
||||||
|
virtual ~CaptiveRequestHandler();
|
||||||
|
|
||||||
|
bool canHandle(AsyncWebServerRequest *request) override;
|
||||||
|
|
||||||
|
void handleRequest(AsyncWebServerRequest *request) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isLocalIp(String name);
|
||||||
|
bool isLocalName(String name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
char _local_name[32];
|
||||||
|
IPAddress _local_ip;
|
||||||
|
};
|
||||||
@@ -1,5 +1,24 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
enum TimerTask_t { WIFI_SCAN,
|
||||||
|
WIFI_MQTT_CONNECTION_CHECK,
|
||||||
|
SENSORS,
|
||||||
|
STEPPER1,
|
||||||
|
STEPPER2,
|
||||||
|
LOG1,
|
||||||
|
LOG2,
|
||||||
|
LOG3,
|
||||||
|
LOG4,
|
||||||
|
LOG5,
|
||||||
|
TIMER_COUNTDOWN,
|
||||||
|
TIME,
|
||||||
|
TIME_SYNC,
|
||||||
|
STATISTICS,
|
||||||
|
UPTIME,
|
||||||
|
UDP,
|
||||||
|
UDP_DB,
|
||||||
|
TEST };
|
||||||
|
|
||||||
enum ErrorType_t {
|
enum ErrorType_t {
|
||||||
ET_NONE,
|
ET_NONE,
|
||||||
ET_FUNCTION,
|
ET_FUNCTION,
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "UptimeInterval.h"
|
#include "UptimeInterval.h"
|
||||||
#include "Clock.h"
|
#include "Clock.h"
|
||||||
|
|
||||||
|
#include "MqttClient.h"
|
||||||
#include "Utils\FileUtils.h"
|
#include "Utils\FileUtils.h"
|
||||||
#include "Utils\JsonUtils.h"
|
#include "Utils\JsonUtils.h"
|
||||||
#include "Utils\StringUtils.h"
|
#include "Utils\StringUtils.h"
|
||||||
@@ -63,31 +64,13 @@ 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum { WIFI_SCAN,
|
|
||||||
WIFI_MQTT_CONNECTION_CHECK,
|
|
||||||
SENSORS,
|
|
||||||
STEPPER1,
|
|
||||||
STEPPER2,
|
|
||||||
LOG1,
|
|
||||||
LOG2,
|
|
||||||
LOG3,
|
|
||||||
LOG4,
|
|
||||||
LOG5,
|
|
||||||
TIMER_COUNTDOWN,
|
|
||||||
TIME,
|
|
||||||
TIME_SYNC,
|
|
||||||
STATISTICS,
|
|
||||||
UPTIME,
|
|
||||||
UDP,
|
|
||||||
UDP_DB,
|
|
||||||
TEST };
|
|
||||||
|
|
||||||
extern boolean just_load;
|
extern boolean just_load;
|
||||||
|
|
||||||
extern String configSetupJson; //все настройки
|
extern String configSetupJson; //все настройки
|
||||||
@@ -199,18 +182,6 @@ extern void servo_();
|
|||||||
|
|
||||||
extern void setLedStatus(LedStatus_t);
|
extern void setLedStatus(LedStatus_t);
|
||||||
|
|
||||||
// Mqtt
|
|
||||||
extern void initMQTT();
|
|
||||||
extern void loopMQTT();
|
|
||||||
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 void reconnectMQTT();
|
|
||||||
|
|
||||||
//Scenario
|
//Scenario
|
||||||
extern void eventGen(String event_name, String number);
|
extern void eventGen(String event_name, String number);
|
||||||
extern String add_set(String param_name);
|
extern String add_set(String param_name);
|
||||||
@@ -284,6 +255,7 @@ extern void do_mqtt_send_settings_to_udp();
|
|||||||
extern void Web_server_init();
|
extern void Web_server_init();
|
||||||
|
|
||||||
// iot_firmware
|
// iot_firmware
|
||||||
|
extern void loopSerial();
|
||||||
extern void loopCmd();
|
extern void loopCmd();
|
||||||
extern void loopButton();
|
extern void loopButton();
|
||||||
extern void loopScenario();
|
extern void loopScenario();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class Telnet : public Module {
|
|||||||
void sendData(const String&);
|
void sendData(const String&);
|
||||||
bool hasClient();
|
bool hasClient();
|
||||||
bool isShellActive();
|
bool isShellActive();
|
||||||
|
void setCommandShell(CommandShell*);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool onInit() override;
|
bool onInit() override;
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ enum State { ST_INACTIVE,
|
|||||||
class Terminal : public Print {
|
class Terminal : public Print {
|
||||||
public:
|
public:
|
||||||
Terminal(Stream *stream = nullptr);
|
Terminal(Stream *stream = nullptr);
|
||||||
~Terminal();
|
|
||||||
void setStream(Stream *stream);
|
void setStream(Stream *stream);
|
||||||
void setEOL(EOLType_t code);
|
void setEOL(EOLType_t code);
|
||||||
void enableControlCodes(bool enabled = true);
|
void enableControlCodes(bool enabled = true);
|
||||||
@@ -152,12 +152,12 @@ class Terminal : public Print {
|
|||||||
uint8_t curY = 0xff;
|
uint8_t curY = 0xff;
|
||||||
uint8_t curX = 0xff;
|
uint8_t curX = 0xff;
|
||||||
|
|
||||||
unsigned long lastReceived = 0;
|
unsigned long _lastReceived = 0;
|
||||||
State state = ST_INACTIVE;
|
State state;
|
||||||
Stream *_stream;
|
Stream *_stream;
|
||||||
EditLine _line;
|
EditLine _line;
|
||||||
char cc_buf[32] = {0};
|
char _cc_buf[32] = {0};
|
||||||
size_t cc_pos = 0;
|
size_t _cc_pos = 0;
|
||||||
bool _color = false;
|
bool _color = false;
|
||||||
bool _controlCodes = false;
|
bool _controlCodes = false;
|
||||||
bool _echo = false;
|
bool _echo = false;
|
||||||
|
|||||||
27
include/MqttClient.h
Normal file
27
include/MqttClient.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
namespace MqttClient {
|
||||||
|
|
||||||
|
void init();
|
||||||
|
boolean connect();
|
||||||
|
void reconnect();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
void subscribe();
|
||||||
|
|
||||||
|
boolean publish(const String& topic, const String& data);
|
||||||
|
boolean publishData(const String& topic, const String& data);
|
||||||
|
boolean publishChart(const String& topic, const String& data);
|
||||||
|
boolean publishControl(String id, String topic, String state);
|
||||||
|
boolean publishChart_test(const String& topic, const String& data);
|
||||||
|
boolean publishStatus(const String& topic, const String& data);
|
||||||
|
|
||||||
|
void publishWidgets();
|
||||||
|
void publishState();
|
||||||
|
|
||||||
|
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
|
||||||
|
const String getStateStr();
|
||||||
|
|
||||||
|
} // namespace MqttClient
|
||||||
@@ -40,3 +40,13 @@ int timeZoneInSeconds(const byte timeZone);
|
|||||||
bool hasTimeSynced();
|
bool hasTimeSynced();
|
||||||
|
|
||||||
int getBiasInSeconds();
|
int getBiasInSeconds();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Время (мс) прошедщее с @simce
|
||||||
|
*/
|
||||||
|
unsigned long millis_since(unsigned long sinse);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Интерввал времени (мс) между @start и @fimish
|
||||||
|
*/
|
||||||
|
unsigned long millis_passed(unsigned long start, unsigned long finish);
|
||||||
33
src/CaptiveRequestHandler.cpp
Normal file
33
src/CaptiveRequestHandler.cpp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#include "CaptiveRequestHandler.h"
|
||||||
|
|
||||||
|
CaptiveRequestHandler::CaptiveRequestHandler(const char *host) {
|
||||||
|
strlcpy(_local_name, host, sizeof(_local_name));
|
||||||
|
strcat(_local_name, ".local");
|
||||||
|
}
|
||||||
|
|
||||||
|
CaptiveRequestHandler::~CaptiveRequestHandler() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CaptiveRequestHandler::isLocalIp(String address) {
|
||||||
|
IPAddress ip;
|
||||||
|
return !ip.fromString(address) || (ip != _local_ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CaptiveRequestHandler::isLocalName(String host_name) {
|
||||||
|
return host_name.equalsIgnoreCase(_local_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CaptiveRequestHandler::canHandle(AsyncWebServerRequest *request) {
|
||||||
|
_local_ip = request->client()->localIP();
|
||||||
|
|
||||||
|
return !isLocalIp(request->getHeader("HOST")->value()) && !isLocalName(request->getHeader("HOST")->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CaptiveRequestHandler::CaptiveRequestHandler::handleRequest(AsyncWebServerRequest *request) {
|
||||||
|
char buf[64];
|
||||||
|
sprintf(buf, "http://%s%s", _local_name, request->url().c_str());
|
||||||
|
auto response = request->beginResponse(302, "text/html");
|
||||||
|
response->addHeader("Location", buf);
|
||||||
|
response->addHeader("Connection", "close");
|
||||||
|
request->send(response);
|
||||||
|
};
|
||||||
43
src/Cmd.cpp
43
src/Cmd.cpp
@@ -1,5 +1,11 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
|
#include "Module/Terminal.h"
|
||||||
|
|
||||||
|
static const char *MODULE = "Cmd";
|
||||||
|
|
||||||
|
Terminal *term = nullptr;
|
||||||
|
|
||||||
boolean but[NUM_BUTTONS];
|
boolean but[NUM_BUTTONS];
|
||||||
Bounce *buttons = new Bounce[NUM_BUTTONS];
|
Bounce *buttons = new Bounce[NUM_BUTTONS];
|
||||||
|
|
||||||
@@ -167,7 +173,7 @@ void buttonSet() {
|
|||||||
|
|
||||||
jsonWriteStr(configLiveJson, "button" + button_number, button_state);
|
jsonWriteStr(configLiveJson, "button" + button_number, button_state);
|
||||||
|
|
||||||
publishStatus("button" + button_number, button_state);
|
MqttClient::publishStatus("button" + button_number, button_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void buttonChange() {
|
void buttonChange() {
|
||||||
@@ -181,7 +187,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);
|
||||||
publishStatus("button" + button_number, current_state);
|
MqttClient::publishStatus("button" + button_number, current_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pinSet() {
|
void pinSet() {
|
||||||
@@ -230,7 +236,7 @@ void pwmSet() {
|
|||||||
|
|
||||||
jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state);
|
jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state);
|
||||||
|
|
||||||
publishStatus("pwm" + pwm_number, pwm_state);
|
MqttClient::publishStatus("pwm" + pwm_number, pwm_state);
|
||||||
}
|
}
|
||||||
//==================================================================================================================
|
//==================================================================================================================
|
||||||
//==========================================Модуль физической кнопки================================================
|
//==========================================Модуль физической кнопки================================================
|
||||||
@@ -244,6 +250,12 @@ void switch_() {
|
|||||||
but[switch_number.toInt()] = true;
|
but[switch_number.toInt()] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void loopSerial() {
|
||||||
|
if (term) {
|
||||||
|
term->loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void loopButton() {
|
void loopButton() {
|
||||||
static uint8_t switch_number = 1;
|
static uint8_t switch_number = 1;
|
||||||
|
|
||||||
@@ -285,7 +297,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);
|
||||||
publishStatus("digit" + number, value);
|
MqttClient::publishStatus("digit" + number, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================================================================================================
|
//=====================================================================================================================================
|
||||||
@@ -307,7 +319,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);
|
||||||
publishStatus("time" + number, value);
|
MqttClient::publishStatus("time" + number, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_time_init() {
|
void handle_time_init() {
|
||||||
@@ -347,7 +359,7 @@ void textSet() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
jsonWriteStr(configLiveJson, "text" + number, text);
|
jsonWriteStr(configLiveJson, "text" + number, text);
|
||||||
publishStatus("text" + number, text);
|
MqttClient::publishStatus("text" + number, text);
|
||||||
}
|
}
|
||||||
//=====================================================================================================================================
|
//=====================================================================================================================================
|
||||||
//=========================================Модуль шагового мотора======================================================================
|
//=========================================Модуль шагового мотора======================================================================
|
||||||
@@ -503,7 +515,7 @@ void servoSet() {
|
|||||||
|
|
||||||
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
|
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
|
||||||
|
|
||||||
publishStatus("servo" + servo_number, servo_state);
|
MqttClient::publishStatus("servo" + servo_number, servo_state);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -516,14 +528,27 @@ void serialBegin() {
|
|||||||
if (mySerial) {
|
if (mySerial) {
|
||||||
delete mySerial;
|
delete mySerial;
|
||||||
}
|
}
|
||||||
|
|
||||||
mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt());
|
mySerial = new SoftwareSerial(rxPin.toInt(), txPin.toInt());
|
||||||
mySerial->begin(s_speed.toInt());
|
mySerial->begin(s_speed.toInt());
|
||||||
|
|
||||||
|
term = new Terminal(mySerial);
|
||||||
|
term->setEOL(LF);
|
||||||
|
term->enableColors(false);
|
||||||
|
term->enableControlCodes(false);
|
||||||
|
term->enableEcho(false);
|
||||||
|
term->setOnReadLine([](const char *str) {
|
||||||
|
String line = String(str);
|
||||||
|
pm.info("serial read: " + line);
|
||||||
|
//line.replace("#", " ");
|
||||||
|
order_loop += line + ",";
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialWrite() {
|
void serialWrite() {
|
||||||
String payload = sCmd.next();
|
String payload = sCmd.next();
|
||||||
if (mySerial) {
|
if (term) {
|
||||||
mySerial->println(payload);
|
term->println(payload.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -60,14 +60,14 @@ void Device_init() {
|
|||||||
removeFile("/layout.txt");
|
removeFile("/layout.txt");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
txtExecution("firmware.c.txt");
|
txtExecution("100с.txt");
|
||||||
//outcoming_date();
|
//outcoming_date();
|
||||||
}
|
}
|
||||||
//-------------------------------сценарии-----------------------------------------------------
|
//-------------------------------сценарии-----------------------------------------------------
|
||||||
|
|
||||||
void Scenario_init() {
|
void Scenario_init() {
|
||||||
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
scenario = readFile("firmware.s.txt", 2048);
|
scenario = readFile("100s.txt", 2048);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,8 @@ 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);
|
||||||
publishChart(topic, json_array);
|
|
||||||
|
MqttClient::publishChart(topic, json_array);
|
||||||
json_array = "";
|
json_array = "";
|
||||||
printMemoryStatus("[I] send log date");
|
printMemoryStatus("[I] send log date");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ bool Telnet::onInit() {
|
|||||||
_term->enableControlCodes();
|
_term->enableControlCodes();
|
||||||
_term->enableEcho(false);
|
_term->enableEcho(false);
|
||||||
_term->setStream(&_client);
|
_term->setStream(&_client);
|
||||||
|
|
||||||
// _shell = new CommandShell(Cli::get());
|
|
||||||
_shell->setTerm(_term);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +34,11 @@ void Telnet::sendData(const String& data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Telnet::setCommandShell(CommandShell* shell) {
|
||||||
|
_shell = shell;
|
||||||
|
_shell->setTerm(_term);
|
||||||
|
}
|
||||||
|
|
||||||
void Telnet::setEventHandler(TelnetEventHandler h) { _eventHandler = h; }
|
void Telnet::setEventHandler(TelnetEventHandler h) { _eventHandler = h; }
|
||||||
|
|
||||||
void Telnet::onLoop() {
|
void Telnet::onLoop() {
|
||||||
|
|||||||
320
src/Module/Terminal.cpp
Normal file
320
src/Module/Terminal.cpp
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
#include "Module/Terminal.h"
|
||||||
|
|
||||||
|
#include "Utils/TimeUtils.h"
|
||||||
|
|
||||||
|
#define INPUT_MAX_LENGHT 255
|
||||||
|
|
||||||
|
Terminal::Terminal(Stream *stream) : _stream{stream},
|
||||||
|
_line(INPUT_MAX_LENGHT),
|
||||||
|
_cc_pos(0),
|
||||||
|
_color(false),
|
||||||
|
_controlCodes(false),
|
||||||
|
_echo(false),
|
||||||
|
_eol(CRLF) { state = ST_NORMAL; };
|
||||||
|
|
||||||
|
void Terminal::setStream(Stream *stream) {
|
||||||
|
_stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::setOnReadLine(TerminalInputEventHandler h) { inputHandler_ = h; }
|
||||||
|
|
||||||
|
void Terminal::setOnEvent(TerminalEventHandler h) { eventHandler_ = h; }
|
||||||
|
|
||||||
|
bool Terminal::available() {
|
||||||
|
return _stream != nullptr ? _stream->available() : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::setEOL(EOLType_t eol) {
|
||||||
|
_eol = eol;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::enableEcho(bool enabled) {
|
||||||
|
_echo = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::enableColors(bool enabled) {
|
||||||
|
_color = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::enableControlCodes(bool enabled) {
|
||||||
|
_controlCodes = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::quit() {}
|
||||||
|
|
||||||
|
void Terminal::loop() {
|
||||||
|
if (_stream == nullptr || !_stream->available()) return;
|
||||||
|
|
||||||
|
sint8_t moveX = 0;
|
||||||
|
sint8_t moveY = 0;
|
||||||
|
|
||||||
|
char c = _stream->read();
|
||||||
|
|
||||||
|
_lastReceived = millis();
|
||||||
|
|
||||||
|
if (state == ST_INACTIVE) {
|
||||||
|
// wait for CR
|
||||||
|
if (c == CHAR_CR) {
|
||||||
|
if (eventHandler_) {
|
||||||
|
eventHandler_(EVENT_OPEN, _stream);
|
||||||
|
state = ST_NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// or ignore all other
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == CHAR_LF || c == CHAR_NULL || c == CHAR_BIN)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Esc
|
||||||
|
if (c == CHAR_ESC || c == 195) {
|
||||||
|
state = ST_ESC_SEQ;
|
||||||
|
_cc_pos = 0;
|
||||||
|
for (size_t i = 0; i < 2; ++i) {
|
||||||
|
bool timeout = false;
|
||||||
|
while (!_stream->available() &&
|
||||||
|
!(timeout = millis_since(_lastReceived) > 10)) {
|
||||||
|
delay(0);
|
||||||
|
}
|
||||||
|
if (timeout) {
|
||||||
|
state = ST_NORMAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_lastReceived = millis();
|
||||||
|
c = _stream->read();
|
||||||
|
_cc_buf[_cc_pos] = c;
|
||||||
|
if ((c == '[') || ((c >= 'A' && c <= 'Z') || c == '~')) {
|
||||||
|
_cc_pos++;
|
||||||
|
_cc_buf[++_cc_pos] = '\x00';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint8_t i;
|
||||||
|
for (i = 0; i < 10; ++i) {
|
||||||
|
if (strcmp(_cc_buf, keyMap[i].cc) == 0) {
|
||||||
|
c = keyMap[i].ch;
|
||||||
|
state = ST_NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == ST_ESC_SEQ) {
|
||||||
|
state = ST_NORMAL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WHEN NORMAL
|
||||||
|
if (state == ST_NORMAL) {
|
||||||
|
if (c == CHAR_ESC) {
|
||||||
|
if (!_line.available()) {
|
||||||
|
// QUIT
|
||||||
|
state = ST_INACTIVE;
|
||||||
|
if (eventHandler_)
|
||||||
|
eventHandler_(EVENT_CLOSE, _stream);
|
||||||
|
} else {
|
||||||
|
// CLEAR
|
||||||
|
_line.clear();
|
||||||
|
if (_controlCodes) {
|
||||||
|
clear_line();
|
||||||
|
} else {
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case CHAR_CR:
|
||||||
|
println();
|
||||||
|
if (inputHandler_)
|
||||||
|
inputHandler_(_line.c_str());
|
||||||
|
_line.clear();
|
||||||
|
moveY++;
|
||||||
|
break;
|
||||||
|
case CHAR_TAB:
|
||||||
|
if (eventHandler_)
|
||||||
|
eventHandler_(EVENT_TAB, _stream);
|
||||||
|
return;
|
||||||
|
case KEY_LEFT:
|
||||||
|
if (_line.prev())
|
||||||
|
moveX--;
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
if (_line.next())
|
||||||
|
moveX++;
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
moveX = -1 * _line.home();
|
||||||
|
break;
|
||||||
|
case KEY_END:
|
||||||
|
moveX = _line.end();
|
||||||
|
break;
|
||||||
|
case CHAR_BS:
|
||||||
|
case KEY_DEL:
|
||||||
|
if (_line.backspace()) {
|
||||||
|
backsp();
|
||||||
|
moveX--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// printable ascii 7bit or printable 8bit ISO8859
|
||||||
|
if ((c & '\x7F') >= 32 && (c & '\x7F') < 127)
|
||||||
|
if (_line.write(c)) {
|
||||||
|
if (_echo) write(c);
|
||||||
|
moveX++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (controlCodesEnabled)
|
||||||
|
// move(startY + moveY, startX + moveX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Terminal::setLine(const uint8_t *ptr, size_t size) {
|
||||||
|
_line.clear();
|
||||||
|
if (_line.write(ptr, size))
|
||||||
|
print(_line.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CharBuffer &Terminal::getLine() { return _line; }
|
||||||
|
|
||||||
|
void Terminal::start() {
|
||||||
|
if (_controlCodes) initscr();
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::initscr() {
|
||||||
|
write_P(SEQ_LOAD_G1);
|
||||||
|
attrset(A_NORMAL);
|
||||||
|
move(0, 0);
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::attrset(const uint16_t attr) {
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
if (attr != this->attr) {
|
||||||
|
this->write_P(SEQ_ATTRSET);
|
||||||
|
|
||||||
|
i = (attr & F_COLOR) >> 8;
|
||||||
|
|
||||||
|
if (i >= 1 && i <= 8) {
|
||||||
|
this->write_P(SEQ_ATTRSET_FCOLOR);
|
||||||
|
this->write(i - 1 + '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (attr & B_COLOR) >> 12;
|
||||||
|
|
||||||
|
if (i >= 1 && i <= 8) {
|
||||||
|
this->write_P(SEQ_ATTRSET_BCOLOR);
|
||||||
|
this->write(i - 1 + '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attr & A_REVERSE)
|
||||||
|
this->write_P(SEQ_ATTRSET_REVERSE);
|
||||||
|
if (attr & A_UNDERLINE)
|
||||||
|
this->write_P(SEQ_ATTRSET_UNDERLINE);
|
||||||
|
if (attr & A_BLINK)
|
||||||
|
this->write_P(SEQ_ATTRSET_BLINK);
|
||||||
|
if (attr & A_BOLD)
|
||||||
|
this->write_P(SEQ_ATTRSET_BOLD);
|
||||||
|
if (attr & A_DIM)
|
||||||
|
this->write_P(SEQ_ATTRSET_DIM);
|
||||||
|
this->write('m');
|
||||||
|
this->attr = attr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::clear() { write_P(SEQ_CLEAR); }
|
||||||
|
|
||||||
|
void Terminal::clear_line() {
|
||||||
|
write(CHAR_CR);
|
||||||
|
write_P(ESC_CLEAR_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::move(uint8_t y, uint8_t x) {
|
||||||
|
write_P(SEQ_CSI);
|
||||||
|
writeByDigit(y + 1);
|
||||||
|
write(';');
|
||||||
|
writeByDigit(x + 1);
|
||||||
|
write('H');
|
||||||
|
curY = y;
|
||||||
|
curX = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::writeByDigit(uint8_t i) {
|
||||||
|
uint8_t ii;
|
||||||
|
if (i >= 10) {
|
||||||
|
if (i >= 100) {
|
||||||
|
ii = i / 100;
|
||||||
|
write(ii + '0');
|
||||||
|
i -= 100 * ii;
|
||||||
|
}
|
||||||
|
ii = i / 10;
|
||||||
|
write(ii + '0');
|
||||||
|
i -= 10 * ii;
|
||||||
|
}
|
||||||
|
write(i + '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terminal::backsp() {
|
||||||
|
write(CHAR_BS);
|
||||||
|
write(CHAR_SPACE);
|
||||||
|
write(CHAR_BS);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Terminal::println(const char *str) {
|
||||||
|
size_t n = print(str);
|
||||||
|
return n += println();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Terminal::println(void) {
|
||||||
|
size_t n = 0;
|
||||||
|
switch (_eol) {
|
||||||
|
case CRLF:
|
||||||
|
n += write(CHAR_CR);
|
||||||
|
n += write(CHAR_LF);
|
||||||
|
break;
|
||||||
|
case LF:
|
||||||
|
n += write(CHAR_LF);
|
||||||
|
break;
|
||||||
|
case LFCR:
|
||||||
|
n += write(CHAR_LF);
|
||||||
|
n += write(CHAR_CR);
|
||||||
|
break;
|
||||||
|
case CR:
|
||||||
|
n += write(CHAR_CR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Terminal::write(uint8_t ch) {
|
||||||
|
size_t n = 0;
|
||||||
|
if (_stream)
|
||||||
|
n = _stream->write(ch);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Terminal::write_P(PGM_P str) {
|
||||||
|
uint8_t ch;
|
||||||
|
size_t n = 0;
|
||||||
|
while ((ch = pgm_read_byte(str + n)) != '\x0') {
|
||||||
|
_stream->write(ch);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Terminal::write(const uint8_t *buf, size_t size) {
|
||||||
|
size_t n = 0;
|
||||||
|
while (size--) {
|
||||||
|
if (_stream->write(*buf++))
|
||||||
|
n++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
|
#include "MqttClient.h"
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
//
|
|
||||||
#include <LittleFS.h>
|
#include <LittleFS.h>
|
||||||
|
|
||||||
static const char* MODULE = "Mqtt";
|
static const char* MODULE = "Mqtt";
|
||||||
|
|
||||||
|
namespace MqttClient {
|
||||||
|
|
||||||
// Errors
|
// Errors
|
||||||
int wifi_lost_error = 0;
|
int wifi_lost_error = 0;
|
||||||
int mqtt_lost_error = 0;
|
int mqtt_lost_error = 0;
|
||||||
@@ -13,14 +14,7 @@ int mqtt_lost_error = 0;
|
|||||||
String mqttPrefix;
|
String mqttPrefix;
|
||||||
String mqttRootDevice;
|
String mqttRootDevice;
|
||||||
|
|
||||||
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
|
void init() {
|
||||||
const String getMqttStateStr();
|
|
||||||
void sendAllData();
|
|
||||||
void sendAllWigets();
|
|
||||||
boolean publicStatus(String topic, String state);
|
|
||||||
void outcoming_date();
|
|
||||||
|
|
||||||
void initMQTT() {
|
|
||||||
mqtt.setCallback(handleSubscribedUpdates);
|
mqtt.setCallback(handleSubscribedUpdates);
|
||||||
|
|
||||||
ts.add(
|
ts.add(
|
||||||
@@ -31,7 +25,7 @@ void initMQTT() {
|
|||||||
pm.info("OK");
|
pm.info("OK");
|
||||||
setLedStatus(LED_OFF);
|
setLedStatus(LED_OFF);
|
||||||
} else {
|
} else {
|
||||||
connectMQTT();
|
connect();
|
||||||
if (!just_load) mqtt_lost_error++;
|
if (!just_load) mqtt_lost_error++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -44,15 +38,17 @@ void initMQTT() {
|
|||||||
nullptr, true);
|
nullptr, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void reconnectMQTT() {
|
void disconnect() {
|
||||||
if (mqttParamsChanged) {
|
pm.info("disconnect");
|
||||||
mqtt.disconnect();
|
mqtt.disconnect();
|
||||||
connectMQTT();
|
|
||||||
mqttParamsChanged = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loopMQTT() {
|
void reconnect() {
|
||||||
|
disconnect();
|
||||||
|
connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
if (!isNetworkActive() || !mqtt.connected()) {
|
if (!isNetworkActive() || !mqtt.connected()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -60,10 +56,7 @@ void loopMQTT() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void subscribe() {
|
void subscribe() {
|
||||||
pm.info("Subscribe");
|
pm.info("subscribe");
|
||||||
// Для приема получения HELLOW и подтверждения связи
|
|
||||||
// Подписываемся на топики control
|
|
||||||
// Подписываемся на топики order
|
|
||||||
mqtt.subscribe(mqttPrefix.c_str());
|
mqtt.subscribe(mqttPrefix.c_str());
|
||||||
mqtt.subscribe((mqttRootDevice + "/+/control").c_str());
|
mqtt.subscribe((mqttRootDevice + "/+/control").c_str());
|
||||||
mqtt.subscribe((mqttRootDevice + "/order").c_str());
|
mqtt.subscribe((mqttRootDevice + "/order").c_str());
|
||||||
@@ -72,10 +65,11 @@ void subscribe() {
|
|||||||
mqtt.subscribe((mqttRootDevice + "/devs").c_str());
|
mqtt.subscribe((mqttRootDevice + "/devs").c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean connectMQTT() {
|
boolean connect() {
|
||||||
if (!isNetworkActive()) {
|
if (!isNetworkActive()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
pm.info("connect");
|
||||||
|
|
||||||
String addr = jsonReadStr(configSetupJson, "mqttServer");
|
String addr = jsonReadStr(configSetupJson, "mqttServer");
|
||||||
if (!addr) {
|
if (!addr) {
|
||||||
@@ -125,8 +119,8 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
|
|||||||
if (payloadStr == "HELLO") {
|
if (payloadStr == "HELLO") {
|
||||||
//данные которые отправляем при подключении или отбновлении страницы
|
//данные которые отправляем при подключении или отбновлении страницы
|
||||||
pm.info("Send web page updates");
|
pm.info("Send web page updates");
|
||||||
sendAllWigets();
|
publishWidgets();
|
||||||
sendAllData();
|
publishState();
|
||||||
#ifdef LOGGING_ENABLED
|
#ifdef LOGGING_ENABLED
|
||||||
choose_log_date_and_send();
|
choose_log_date_and_send();
|
||||||
#endif
|
#endif
|
||||||
@@ -154,10 +148,10 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
|
|||||||
upgrade = true;
|
upgrade = true;
|
||||||
}
|
}
|
||||||
} else if (topicStr.indexOf("devc")) {
|
} else if (topicStr.indexOf("devc")) {
|
||||||
writeFile("firmware.c.txt", payloadStr);
|
writeFile("100с.txt", payloadStr);
|
||||||
Device_init();
|
Device_init();
|
||||||
} else if (topicStr.indexOf("devs")) {
|
} else if (topicStr.indexOf("devs")) {
|
||||||
writeFile("firmware.s.txt", payloadStr);
|
writeFile("100s.txt", payloadStr);
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -193,9 +187,9 @@ boolean publishControl(String id, String topic, String state) {
|
|||||||
return mqtt.publish(path.c_str(), state.c_str(), false);
|
return mqtt.publish(path.c_str(), state.c_str(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean sendCHART_test(String topic, String data) {
|
boolean publishChart_test(const String& topic, const String& data) {
|
||||||
topic = mqttRootDevice + "/" + topic + "/status";
|
String path = mqttRootDevice + "/" + topic + "/status";
|
||||||
return mqtt.publish(topic.c_str(), data.c_str(), false);
|
return mqtt.publish(path.c_str(), data.c_str(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean publishStatus(const String& topic, const String& data) {
|
boolean publishStatus(const String& topic, const String& data) {
|
||||||
@@ -205,9 +199,8 @@ boolean publishStatus(const String& topic, const String& data) {
|
|||||||
return mqtt.publish(path.c_str(), json.c_str(), false);
|
return mqtt.publish(path.c_str(), json.c_str(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
|
|
||||||
#ifdef LAYOUT_IN_RAM
|
#ifdef LAYOUT_IN_RAM
|
||||||
void sendAllWigets() {
|
void publishWidgets() {
|
||||||
if (all_widgets != "") {
|
if (all_widgets != "") {
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
String line;
|
String line;
|
||||||
@@ -231,7 +224,7 @@ void sendAllWigets() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LAYOUT_IN_RAM
|
#ifndef LAYOUT_IN_RAM
|
||||||
void sendAllWigets() {
|
void publishWidgets() {
|
||||||
auto file = seekFile("/layout.txt");
|
auto file = seekFile("/layout.txt");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return;
|
return;
|
||||||
@@ -245,9 +238,7 @@ void sendAllWigets() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ========================================================
|
void publishState() {
|
||||||
|
|
||||||
void sendAllData() {
|
|
||||||
// берет строку json и ключи превращает в топики а значения колючей в них посылает
|
// берет строку 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"
|
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
|
||||||
@@ -274,7 +265,7 @@ void sendAllData() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const String getMqttStateStr() {
|
const String getStateStr() {
|
||||||
switch (mqtt.state()) {
|
switch (mqtt.state()) {
|
||||||
case -4:
|
case -4:
|
||||||
return F("no respond");
|
return F("no respond");
|
||||||
@@ -311,3 +302,5 @@ const String getMqttStateStr() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace MqttClient
|
||||||
@@ -146,12 +146,16 @@ void ultrasonic_reading() {
|
|||||||
|
|
||||||
jsonWriteInt(configLiveJson, levelPr_value_name, level);
|
jsonWriteInt(configLiveJson, levelPr_value_name, level);
|
||||||
eventGen(levelPr_value_name, "");
|
eventGen(levelPr_value_name, "");
|
||||||
publishStatus(levelPr_value_name, String(level));
|
|
||||||
|
MqttClient::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, "");
|
||||||
publishStatus(ultrasonicCm_value_name, String(distance_cm));
|
|
||||||
|
MqttClient::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 +205,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, "");
|
||||||
publishStatus(value_name, String(analog));
|
MqttClient::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 +224,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, "");
|
||||||
publishStatus(value_name, String(analog));
|
MqttClient::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 +253,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", "");
|
||||||
publishStatus("dallas", String(temp));
|
MqttClient::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 +284,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) {
|
||||||
publishStatus(dhtT_value_name, String(dht.getStatusString()));
|
MqttClient::publishStatus(dhtT_value_name, String(dht.getStatusString()));
|
||||||
counter++;
|
counter++;
|
||||||
} else {
|
} else {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
@@ -288,7 +292,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));
|
||||||
publishStatus(dhtT_value_name, String(value));
|
MqttClient::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 +322,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) {
|
||||||
publishStatus(dhtH_value_name, String(dht.getStatusString()));
|
MqttClient::publishStatus(dhtH_value_name, String(dht.getStatusString()));
|
||||||
counter++;
|
counter++;
|
||||||
} else {
|
} else {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
@@ -326,7 +330,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));
|
||||||
publishStatus(dhtH_value_name, String(value));
|
MqttClient::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 +348,13 @@ void dhtP() {
|
|||||||
void dhtP_reading() {
|
void dhtP_reading() {
|
||||||
byte value;
|
byte value;
|
||||||
if (dht.getStatus() != 0) {
|
if (dht.getStatus() != 0) {
|
||||||
publishStatus("dhtPerception", String(dht.getStatusString()));
|
MqttClient::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", "");
|
||||||
publishStatus("dhtPerception", final_line);
|
MqttClient::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 +406,13 @@ void dhtC() {
|
|||||||
void dhtC_reading() {
|
void dhtC_reading() {
|
||||||
ComfortState cf;
|
ComfortState cf;
|
||||||
if (dht.getStatus() != 0) {
|
if (dht.getStatus() != 0) {
|
||||||
publishStatus("dhtComfort", String(dht.getStatusString()));
|
MqttClient::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", "");
|
||||||
publishStatus("dhtComfort", final_line);
|
MqttClient::publishStatus("dhtComfort", final_line);
|
||||||
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
|
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -462,12 +466,12 @@ void dhtD() {
|
|||||||
void dhtD_reading() {
|
void dhtD_reading() {
|
||||||
float value;
|
float value;
|
||||||
if (dht.getStatus() != 0) {
|
if (dht.getStatus() != 0) {
|
||||||
publishStatus("dhtDewpoint", String(dht.getStatusString()));
|
MqttClient::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", "");
|
||||||
publishStatus("dhtDewpoint", String(value));
|
MqttClient::publishStatus("dhtDewpoint", String(value));
|
||||||
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
|
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -503,7 +507,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, "");
|
||||||
publishStatus(bmp280T_value_name, String(value));
|
MqttClient::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 +539,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, "");
|
||||||
publishStatus(bmp280P_value_name, String(value));
|
MqttClient::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 +564,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, "");
|
||||||
publishStatus(bme280T_value_name, String(value));
|
MqttClient::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 +588,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, "");
|
||||||
publishStatus(bme280P_value_name, String(value));
|
MqttClient::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 +611,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, "");
|
||||||
publishStatus(bme280H_value_name, String(value));
|
MqttClient::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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -631,7 +635,7 @@ void bme280A_reading() {
|
|||||||
|
|
||||||
eventGen(bme280A_value_name, "");
|
eventGen(bme280A_value_name, "");
|
||||||
|
|
||||||
publishStatus(bme280A_value_name, String(value));
|
MqttClient::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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ void upgrade_firmware() {
|
|||||||
String scenario_for_update;
|
String scenario_for_update;
|
||||||
String config_for_update;
|
String config_for_update;
|
||||||
String configSetup_for_update;
|
String configSetup_for_update;
|
||||||
scenario_for_update = readFile("firmware.s.txt", 4000);
|
scenario_for_update = readFile("100s.txt", 4000);
|
||||||
config_for_update = readFile("firmware.c.txt", 4000);
|
config_for_update = readFile("100с.txt", 4000);
|
||||||
configSetup_for_update = configSetupJson;
|
configSetup_for_update = configSetupJson;
|
||||||
|
|
||||||
Serial.println("Start upgrade SPIFFS, please wait...");
|
Serial.println("Start upgrade SPIFFS, please wait...");
|
||||||
@@ -46,8 +46,8 @@ void upgrade_firmware() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ret == HTTP_UPDATE_OK) {
|
if (ret == HTTP_UPDATE_OK) {
|
||||||
writeFile("firmware.s.txt", scenario_for_update);
|
writeFile("100s.txt", scenario_for_update);
|
||||||
writeFile("firmware.c.txt", config_for_update);
|
writeFile("100с.txt", config_for_update);
|
||||||
writeFile("config.json", configSetup_for_update);
|
writeFile("config.json", configSetup_for_update);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
|
|
||||||
|
|||||||
@@ -269,3 +269,29 @@ int timeZoneInSeconds(const byte timeZone) {
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long millis_since(unsigned long sinse) {
|
||||||
|
return millis_passed(sinse, millis());
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long millis_passed(unsigned long start, unsigned long finish) {
|
||||||
|
unsigned long result = 0;
|
||||||
|
if (start <= finish) {
|
||||||
|
unsigned long passed = finish - start;
|
||||||
|
if (passed <= __LONG_MAX__) {
|
||||||
|
result = static_cast<long>(passed);
|
||||||
|
} else {
|
||||||
|
result = static_cast<long>((__LONG_MAX__ - finish) + start + 1u);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
unsigned long passed = start - finish;
|
||||||
|
if (passed <= __LONG_MAX__) {
|
||||||
|
result = static_cast<long>(passed);
|
||||||
|
result = -1 * result;
|
||||||
|
} else {
|
||||||
|
result = static_cast<long>((__LONG_MAX__ - start) + finish + 1u);
|
||||||
|
result = -1 * result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,8 +43,9 @@ void startSTAMode() {
|
|||||||
}
|
}
|
||||||
} while (keepConnecting && tries--);
|
} while (keepConnecting && tries--);
|
||||||
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
if (isNetworkActive()) {
|
||||||
initMQTT();
|
MqttClient::init();
|
||||||
|
|
||||||
setLedStatus(LED_OFF);
|
setLedStatus(LED_OFF);
|
||||||
} else {
|
} else {
|
||||||
startAPMode();
|
startAPMode();
|
||||||
|
|||||||
17
src/Web.cpp
17
src/Web.cpp
@@ -1,5 +1,6 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
|
#include "CaptiveRequestHandler.h"
|
||||||
#include "Utils/PresetUtils.h"
|
#include "Utils/PresetUtils.h"
|
||||||
|
|
||||||
static const char* MODULE = "Web";
|
static const char* MODULE = "Web";
|
||||||
@@ -7,10 +8,6 @@ static const char* MODULE = "Web";
|
|||||||
static const uint8_t MIN_PRESET = 1;
|
static const uint8_t MIN_PRESET = 1;
|
||||||
static const uint8_t MAX_PRESET = 21;
|
static const uint8_t MAX_PRESET = 21;
|
||||||
|
|
||||||
String getMqttStateStr();
|
|
||||||
|
|
||||||
const Item_t getPresetItem(uint8_t preset);
|
|
||||||
|
|
||||||
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
||||||
if (request->hasArg("preset")) {
|
if (request->hasArg("preset")) {
|
||||||
preset = request->getParam("preset")->value().toInt();
|
preset = request->getParam("preset")->value().toInt();
|
||||||
@@ -20,14 +17,16 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void web_init() {
|
void web_init() {
|
||||||
|
// server.addHandler(new CaptiveRequestHandler(jsonReadStr(configSetupJson, "name").c_str())).setFilter(ON_AP_FILTER);
|
||||||
|
|
||||||
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/100с.txt" : getPresetFile(preset, CT_MACRO);
|
||||||
String srcScenario = preset == 21 ? "configs/firmware.s.txt" : getPresetFile(preset, CT_SCENARIO);
|
String srcScenario = preset == 21 ? "configs/100s.txt" : getPresetFile(preset, CT_SCENARIO);
|
||||||
pm.info("activate " + getItemName(getPresetItem(preset)));
|
pm.info("activate " + getItemName(getPresetItem(preset)));
|
||||||
copyFile(srcMacro, "firmware.c.txt");
|
copyFile(srcMacro, "100с.txt");
|
||||||
copyFile(srcScenario, "firmware.s.txt");
|
copyFile(srcScenario, "100s.txt");
|
||||||
|
|
||||||
Device_init();
|
Device_init();
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
@@ -203,7 +202,7 @@ void web_init() {
|
|||||||
|
|
||||||
if (request->hasArg("mqttcheck")) {
|
if (request->hasArg("mqttcheck")) {
|
||||||
String buf = "{}";
|
String buf = "{}";
|
||||||
String payload = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + getMqttStateStr();
|
String payload = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + MqttClient::getStateStr();
|
||||||
jsonWriteStr(buf, "title", payload);
|
jsonWriteStr(buf, "title", payload);
|
||||||
jsonWriteStr(buf, "class", "pop-up");
|
jsonWriteStr(buf, "class", "pop-up");
|
||||||
|
|
||||||
|
|||||||
11
src/main.cpp
11
src/main.cpp
@@ -85,18 +85,25 @@ void loop() {
|
|||||||
|
|
||||||
not_async_actions();
|
not_async_actions();
|
||||||
|
|
||||||
loopMQTT();
|
MqttClient::loop();
|
||||||
|
|
||||||
loopCmd();
|
loopCmd();
|
||||||
loopButton();
|
loopButton();
|
||||||
loopScenario();
|
loopScenario();
|
||||||
#ifdef UDP_ENABLED
|
#ifdef UDP_ENABLED
|
||||||
loopUdp();
|
loopUdp();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
loopSerial();
|
||||||
|
|
||||||
ts.update();
|
ts.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void not_async_actions() {
|
void not_async_actions() {
|
||||||
reconnectMQTT();
|
if (mqttParamsChanged) {
|
||||||
|
MqttClient::reconnect();
|
||||||
|
mqttParamsChanged = false;
|
||||||
|
}
|
||||||
do_upgrade_url();
|
do_upgrade_url();
|
||||||
do_upgrade();
|
do_upgrade();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user