Migrate WebApi loop() methods to scheduler tasks

This commit is contained in:
Thomas Basler 2024-01-20 02:00:22 +01:00
parent e66060e769
commit 251d197fb6
42 changed files with 226 additions and 309 deletions

View File

@ -38,10 +38,6 @@ public:
static void writeConfig(JsonVariant& retMsg, const WebApiError code = WebApiError::GenericSuccess, const String& message = "Settings saved!"); static void writeConfig(JsonVariant& retMsg, const WebApiError code = WebApiError::GenericSuccess, const String& message = "Settings saved!");
private: private:
void loop();
Task _loopTask;
AsyncWebServer _server; AsyncWebServer _server;
WebApiConfigClass _webApiConfig; WebApiConfigClass _webApiConfig;
@ -66,4 +62,4 @@ private:
WebApiWsLiveClass _webApiWsLive; WebApiWsLiveClass _webApiWsLive;
}; };
extern WebApiClass WebApi; extern WebApiClass WebApi;

View File

@ -2,11 +2,11 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiConfigClass { class WebApiConfigClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onConfigGet(AsyncWebServerRequest* request); void onConfigGet(AsyncWebServerRequest* request);
@ -16,4 +16,4 @@ private:
void onConfigUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); void onConfigUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,15 +2,15 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiDeviceClass { class WebApiDeviceClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onDeviceAdminGet(AsyncWebServerRequest* request); void onDeviceAdminGet(AsyncWebServerRequest* request);
void onDeviceAdminPost(AsyncWebServerRequest* request); void onDeviceAdminPost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,14 +2,14 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiDevInfoClass { class WebApiDevInfoClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onDevInfoStatus(AsyncWebServerRequest* request); void onDevInfoStatus(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,16 +2,18 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiDtuClass { class WebApiDtuClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onDtuAdminGet(AsyncWebServerRequest* request); void onDtuAdminGet(AsyncWebServerRequest* request);
void onDtuAdminPost(AsyncWebServerRequest* request); void onDtuAdminPost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
bool _performReload = false;
Task _applyDataTask;
void applyDataTaskCb();
}; };

View File

@ -2,14 +2,14 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiEventlogClass { class WebApiEventlogClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onEventlogStatus(AsyncWebServerRequest* request); void onEventlogStatus(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,15 +2,15 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiFirmwareClass { class WebApiFirmwareClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onFirmwareUpdateFinish(AsyncWebServerRequest* request); void onFirmwareUpdateFinish(AsyncWebServerRequest* request);
void onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); void onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,15 +2,15 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiGridProfileClass { class WebApiGridProfileClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onGridProfileStatus(AsyncWebServerRequest* request); void onGridProfileStatus(AsyncWebServerRequest* request);
void onGridProfileRawdata(AsyncWebServerRequest* request); void onGridProfileRawdata(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,11 +2,11 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiInverterClass { class WebApiInverterClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onInverterList(AsyncWebServerRequest* request); void onInverterList(AsyncWebServerRequest* request);
@ -16,4 +16,4 @@ private:
void onInverterOrder(AsyncWebServerRequest* request); void onInverterOrder(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,15 +2,15 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiLimitClass { class WebApiLimitClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onLimitStatus(AsyncWebServerRequest* request); void onLimitStatus(AsyncWebServerRequest* request);
void onLimitPost(AsyncWebServerRequest* request); void onLimitPost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,14 +2,14 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiMaintenanceClass { class WebApiMaintenanceClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onRebootPost(AsyncWebServerRequest* request); void onRebootPost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,13 +2,13 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
#define MQTT_JSON_DOC_SIZE 10240 #define MQTT_JSON_DOC_SIZE 10240
class WebApiMqttClass { class WebApiMqttClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onMqttStatus(AsyncWebServerRequest* request); void onMqttStatus(AsyncWebServerRequest* request);
@ -17,4 +17,4 @@ private:
String getTlsCertInfo(const char* cert); String getTlsCertInfo(const char* cert);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,11 +2,11 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiNetworkClass { class WebApiNetworkClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onNetworkStatus(AsyncWebServerRequest* request); void onNetworkStatus(AsyncWebServerRequest* request);
@ -14,4 +14,4 @@ private:
void onNetworkAdminPost(AsyncWebServerRequest* request); void onNetworkAdminPost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,11 +2,11 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiNtpClass { class WebApiNtpClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onNtpStatus(AsyncWebServerRequest* request); void onNtpStatus(AsyncWebServerRequest* request);
@ -16,4 +16,4 @@ private:
void onNtpTimePost(AsyncWebServerRequest* request); void onNtpTimePost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,15 +2,15 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiPowerClass { class WebApiPowerClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onPowerStatus(AsyncWebServerRequest* request); void onPowerStatus(AsyncWebServerRequest* request);
void onPowerPost(AsyncWebServerRequest* request); void onPowerPost(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -3,12 +3,12 @@
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <Hoymiles.h> #include <Hoymiles.h>
#include <TaskSchedulerDeclarations.h>
#include <map> #include <map>
class WebApiPrometheusClass { class WebApiPrometheusClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onPrometheusMetricsGet(AsyncWebServerRequest* request); void onPrometheusMetricsGet(AsyncWebServerRequest* request);
@ -47,4 +47,4 @@ private:
{ FLD_EFF, MetricType_t::GAUGE }, { FLD_EFF, MetricType_t::GAUGE },
{ FLD_IRR, MetricType_t::GAUGE }, { FLD_IRR, MetricType_t::GAUGE },
}; };
}; };

View File

@ -2,11 +2,11 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiSecurityClass { class WebApiSecurityClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onSecurityGet(AsyncWebServerRequest* request); void onSecurityGet(AsyncWebServerRequest* request);
@ -15,4 +15,4 @@ private:
void onAuthenticateGet(AsyncWebServerRequest* request); void onAuthenticateGet(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,14 +2,14 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiSysstatusClass { class WebApiSysstatusClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void onSystemStatus(AsyncWebServerRequest* request); void onSystemStatus(AsyncWebServerRequest* request);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -2,12 +2,12 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiWebappClass { class WebApiWebappClass {
public: public:
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -1,17 +1,18 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiWsConsoleClass {
public: class WebApiWsConsoleClass {
WebApiWsConsoleClass(); public:
void init(AsyncWebServer& server); WebApiWsConsoleClass();
void loop(); void init(AsyncWebServer& server, Scheduler& scheduler);
private: private:
AsyncWebServer* _server; AsyncWebServer* _server;
AsyncWebSocket _ws; AsyncWebSocket _ws;
uint32_t _lastWsCleanup = 0; Task _wsCleanupTask;
}; void wsCleanupTaskCb();
};

View File

@ -4,12 +4,12 @@
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <Hoymiles.h> #include <Hoymiles.h>
#include <TaskSchedulerDeclarations.h>
class WebApiWsLiveClass { class WebApiWsLiveClass {
public: public:
WebApiWsLiveClass(); WebApiWsLiveClass();
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
private: private:
void generateJsonResponse(JsonVariant& root); void generateJsonResponse(JsonVariant& root);
@ -22,9 +22,13 @@ private:
AsyncWebSocket _ws; AsyncWebSocket _ws;
uint32_t _lastWsPublish = 0; uint32_t _lastWsPublish = 0;
uint32_t _lastInvUpdateCheck = 0;
uint32_t _lastWsCleanup = 0;
uint32_t _newestInverterTimestamp = 0; uint32_t _newestInverterTimestamp = 0;
std::mutex _mutex; std::mutex _mutex;
};
Task _wsCleanupTask;
void wsCleanupTaskCb();
Task _sendDataTask;
void sendDataTaskCb();
};

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi.h" #include "WebApi.h"
#include "Configuration.h" #include "Configuration.h"
@ -14,56 +14,28 @@ WebApiClass::WebApiClass()
void WebApiClass::init(Scheduler& scheduler) void WebApiClass::init(Scheduler& scheduler)
{ {
_webApiConfig.init(_server); _webApiConfig.init(_server, scheduler);
_webApiDevice.init(_server); _webApiDevice.init(_server, scheduler);
_webApiDevInfo.init(_server); _webApiDevInfo.init(_server, scheduler);
_webApiDtu.init(_server); _webApiDtu.init(_server, scheduler);
_webApiEventlog.init(_server); _webApiEventlog.init(_server, scheduler);
_webApiFirmware.init(_server); _webApiFirmware.init(_server, scheduler);
_webApiGridprofile.init(_server); _webApiGridprofile.init(_server, scheduler);
_webApiInverter.init(_server); _webApiInverter.init(_server, scheduler);
_webApiLimit.init(_server); _webApiLimit.init(_server, scheduler);
_webApiMaintenance.init(_server); _webApiMaintenance.init(_server, scheduler);
_webApiMqtt.init(_server); _webApiMqtt.init(_server, scheduler);
_webApiNetwork.init(_server); _webApiNetwork.init(_server, scheduler);
_webApiNtp.init(_server); _webApiNtp.init(_server, scheduler);
_webApiPower.init(_server); _webApiPower.init(_server, scheduler);
_webApiPrometheus.init(_server); _webApiPrometheus.init(_server, scheduler);
_webApiSecurity.init(_server); _webApiSecurity.init(_server, scheduler);
_webApiSysstatus.init(_server); _webApiSysstatus.init(_server, scheduler);
_webApiWebapp.init(_server); _webApiWebapp.init(_server, scheduler);
_webApiWsConsole.init(_server); _webApiWsConsole.init(_server, scheduler);
_webApiWsLive.init(_server); _webApiWsLive.init(_server, scheduler);
_server.begin(); _server.begin();
scheduler.addTask(_loopTask);
_loopTask.setCallback(std::bind(&WebApiClass::loop, this));
_loopTask.setIterations(TASK_FOREVER);
_loopTask.enable();
}
void WebApiClass::loop()
{
_webApiConfig.loop();
_webApiDevice.loop();
_webApiDevInfo.loop();
_webApiDtu.loop();
_webApiEventlog.loop();
_webApiFirmware.loop();
_webApiGridprofile.loop();
_webApiInverter.loop();
_webApiLimit.loop();
_webApiMaintenance.loop();
_webApiMqtt.loop();
_webApiNetwork.loop();
_webApiNtp.loop();
_webApiPower.loop();
_webApiSecurity.loop();
_webApiSysstatus.loop();
_webApiWebapp.loop();
_webApiWsConsole.loop();
_webApiWsLive.loop();
} }
bool WebApiClass::checkCredentials(AsyncWebServerRequest* request) bool WebApiClass::checkCredentials(AsyncWebServerRequest* request)
@ -113,4 +85,4 @@ void WebApiClass::writeConfig(JsonVariant& retMsg, const WebApiError code, const
} }
} }
WebApiClass WebApi; WebApiClass WebApi;

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_config.h" #include "WebApi_config.h"
#include "Configuration.h" #include "Configuration.h"
@ -10,7 +10,7 @@
#include <AsyncJson.h> #include <AsyncJson.h>
#include <LittleFS.h> #include <LittleFS.h>
void WebApiConfigClass::init(AsyncWebServer& server) void WebApiConfigClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
using std::placeholders::_2; using std::placeholders::_2;
@ -29,10 +29,6 @@ void WebApiConfigClass::init(AsyncWebServer& server)
std::bind(&WebApiConfigClass::onConfigUpload, this, _1, _2, _3, _4, _5, _6)); std::bind(&WebApiConfigClass::onConfigUpload, this, _1, _2, _3, _4, _5, _6));
} }
void WebApiConfigClass::loop()
{
}
void WebApiConfigClass::onConfigGet(AsyncWebServerRequest* request) void WebApiConfigClass::onConfigGet(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -186,4 +182,4 @@ void WebApiConfigClass::onConfigUpload(AsyncWebServerRequest* request, String fi
// close the file handle as the upload is now done // close the file handle as the upload is now done
request->_tempFile.close(); request->_tempFile.close();
} }
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_device.h" #include "WebApi_device.h"
#include "Configuration.h" #include "Configuration.h"
@ -12,7 +12,7 @@
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiDeviceClass::init(AsyncWebServer& server) void WebApiDeviceClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -22,10 +22,6 @@ void WebApiDeviceClass::init(AsyncWebServer& server)
_server->on("/api/device/config", HTTP_POST, std::bind(&WebApiDeviceClass::onDeviceAdminPost, this, _1)); _server->on("/api/device/config", HTTP_POST, std::bind(&WebApiDeviceClass::onDeviceAdminPost, this, _1));
} }
void WebApiDeviceClass::loop()
{
}
void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request) void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_devinfo.h" #include "WebApi_devinfo.h"
#include "WebApi.h" #include "WebApi.h"
@ -8,7 +8,7 @@
#include <Hoymiles.h> #include <Hoymiles.h>
#include <ctime> #include <ctime>
void WebApiDevInfoClass::init(AsyncWebServer& server) void WebApiDevInfoClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -17,10 +17,6 @@ void WebApiDevInfoClass::init(AsyncWebServer& server)
_server->on("/api/devinfo/status", HTTP_GET, std::bind(&WebApiDevInfoClass::onDevInfoStatus, this, _1)); _server->on("/api/devinfo/status", HTTP_GET, std::bind(&WebApiDevInfoClass::onDevInfoStatus, this, _1));
} }
void WebApiDevInfoClass::loop()
{
}
void WebApiDevInfoClass::onDevInfoStatus(AsyncWebServerRequest* request) void WebApiDevInfoClass::onDevInfoStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -9,7 +9,7 @@
#include <AsyncJson.h> #include <AsyncJson.h>
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiDtuClass::init(AsyncWebServer& server) void WebApiDtuClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -17,22 +17,23 @@ void WebApiDtuClass::init(AsyncWebServer& server)
_server->on("/api/dtu/config", HTTP_GET, std::bind(&WebApiDtuClass::onDtuAdminGet, this, _1)); _server->on("/api/dtu/config", HTTP_GET, std::bind(&WebApiDtuClass::onDtuAdminGet, this, _1));
_server->on("/api/dtu/config", HTTP_POST, std::bind(&WebApiDtuClass::onDtuAdminPost, this, _1)); _server->on("/api/dtu/config", HTTP_POST, std::bind(&WebApiDtuClass::onDtuAdminPost, this, _1));
scheduler.addTask(_applyDataTask);
_applyDataTask.setCallback(std::bind(&WebApiDtuClass::applyDataTaskCb, this));
_applyDataTask.setIterations(TASK_ONCE);
} }
void WebApiDtuClass::loop() void WebApiDtuClass::applyDataTaskCb()
{ {
if (_performReload) { // Execute stuff in main thread to avoid busy SPI bus
// Execute stuff in main thread to avoid busy SPI bus CONFIG_T& config = Configuration.get();
CONFIG_T& config = Configuration.get(); Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel);
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel); Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel);
Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel); Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial);
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial); Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial);
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial); Hoymiles.getRadioCmt()->setCountryMode(static_cast<CountryModeId_t>(config.Dtu.Cmt.CountryMode));
Hoymiles.getRadioCmt()->setCountryMode(static_cast<CountryModeId_t>(config.Dtu.Cmt.CountryMode)); Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency); Hoymiles.setPollInterval(config.Dtu.PollInterval);
Hoymiles.setPollInterval(config.Dtu.PollInterval);
_performReload = false;
}
} }
void WebApiDtuClass::onDtuAdminGet(AsyncWebServerRequest* request) void WebApiDtuClass::onDtuAdminGet(AsyncWebServerRequest* request)
@ -196,5 +197,5 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
_performReload = true; _applyDataTask.enable();
} }

View File

@ -1,13 +1,13 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_eventlog.h" #include "WebApi_eventlog.h"
#include "WebApi.h" #include "WebApi.h"
#include <AsyncJson.h> #include <AsyncJson.h>
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiEventlogClass::init(AsyncWebServer& server) void WebApiEventlogClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -16,10 +16,6 @@ void WebApiEventlogClass::init(AsyncWebServer& server)
_server->on("/api/eventlog/status", HTTP_GET, std::bind(&WebApiEventlogClass::onEventlogStatus, this, _1)); _server->on("/api/eventlog/status", HTTP_GET, std::bind(&WebApiEventlogClass::onEventlogStatus, this, _1));
} }
void WebApiEventlogClass::loop()
{
}
void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {
@ -70,4 +66,4 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_firmware.h" #include "WebApi_firmware.h"
#include "Configuration.h" #include "Configuration.h"
@ -10,7 +10,7 @@
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiFirmwareClass::init(AsyncWebServer& server) void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
using std::placeholders::_2; using std::placeholders::_2;
@ -26,10 +26,6 @@ void WebApiFirmwareClass::init(AsyncWebServer& server)
std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6)); std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6));
} }
void WebApiFirmwareClass::loop()
{
}
void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request) void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -83,4 +79,4 @@ void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request,
} else { } else {
return; return;
} }
} }

View File

@ -1,13 +1,13 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_gridprofile.h" #include "WebApi_gridprofile.h"
#include "WebApi.h" #include "WebApi.h"
#include <AsyncJson.h> #include <AsyncJson.h>
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiGridProfileClass::init(AsyncWebServer& server) void WebApiGridProfileClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -17,10 +17,6 @@ void WebApiGridProfileClass::init(AsyncWebServer& server)
_server->on("/api/gridprofile/rawdata", HTTP_GET, std::bind(&WebApiGridProfileClass::onGridProfileRawdata, this, _1)); _server->on("/api/gridprofile/rawdata", HTTP_GET, std::bind(&WebApiGridProfileClass::onGridProfileRawdata, this, _1));
} }
void WebApiGridProfileClass::loop()
{
}
void WebApiGridProfileClass::onGridProfileStatus(AsyncWebServerRequest* request) void WebApiGridProfileClass::onGridProfileStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {
@ -91,4 +87,4 @@ void WebApiGridProfileClass::onGridProfileRawdata(AsyncWebServerRequest* request
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_inverter.h" #include "WebApi_inverter.h"
#include "Configuration.h" #include "Configuration.h"
@ -12,7 +12,7 @@
#include <AsyncJson.h> #include <AsyncJson.h>
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiInverterClass::init(AsyncWebServer& server) void WebApiInverterClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -25,10 +25,6 @@ void WebApiInverterClass::init(AsyncWebServer& server)
_server->on("/api/inverter/order", HTTP_POST, std::bind(&WebApiInverterClass::onInverterOrder, this, _1)); _server->on("/api/inverter/order", HTTP_POST, std::bind(&WebApiInverterClass::onInverterOrder, this, _1));
} }
void WebApiInverterClass::loop()
{
}
void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request) void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -460,4 +456,4 @@ void WebApiInverterClass::onInverterOrder(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_limit.h" #include "WebApi_limit.h"
#include "WebApi.h" #include "WebApi.h"
@ -10,7 +10,7 @@
#include <AsyncJson.h> #include <AsyncJson.h>
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiLimitClass::init(AsyncWebServer& server) void WebApiLimitClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -20,10 +20,6 @@ void WebApiLimitClass::init(AsyncWebServer& server)
_server->on("/api/limit/config", HTTP_POST, std::bind(&WebApiLimitClass::onLimitPost, this, _1)); _server->on("/api/limit/config", HTTP_POST, std::bind(&WebApiLimitClass::onLimitPost, this, _1));
} }
void WebApiLimitClass::loop()
{
}
void WebApiLimitClass::onLimitStatus(AsyncWebServerRequest* request) void WebApiLimitClass::onLimitStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {
@ -156,4 +152,4 @@ void WebApiLimitClass::onLimitPost(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_maintenance.h" #include "WebApi_maintenance.h"
@ -9,7 +9,7 @@
#include "WebApi_errors.h" #include "WebApi_errors.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiMaintenanceClass::init(AsyncWebServer& server) void WebApiMaintenanceClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -18,10 +18,6 @@ void WebApiMaintenanceClass::init(AsyncWebServer& server)
_server->on("/api/maintenance/reboot", HTTP_POST, std::bind(&WebApiMaintenanceClass::onRebootPost, this, _1)); _server->on("/api/maintenance/reboot", HTTP_POST, std::bind(&WebApiMaintenanceClass::onRebootPost, this, _1));
} }
void WebApiMaintenanceClass::loop()
{
}
void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request) void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -84,4 +80,4 @@ void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_mqtt.h" #include "WebApi_mqtt.h"
#include "Configuration.h" #include "Configuration.h"
@ -11,7 +11,7 @@
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiMqttClass::init(AsyncWebServer& server) void WebApiMqttClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -22,10 +22,6 @@ void WebApiMqttClass::init(AsyncWebServer& server)
_server->on("/api/mqtt/config", HTTP_POST, std::bind(&WebApiMqttClass::onMqttAdminPost, this, _1)); _server->on("/api/mqtt/config", HTTP_POST, std::bind(&WebApiMqttClass::onMqttAdminPost, this, _1));
} }
void WebApiMqttClass::loop()
{
}
void WebApiMqttClass::onMqttStatus(AsyncWebServerRequest* request) void WebApiMqttClass::onMqttStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_network.h" #include "WebApi_network.h"
#include "Configuration.h" #include "Configuration.h"
@ -10,7 +10,7 @@
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiNetworkClass::init(AsyncWebServer& server) void WebApiNetworkClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -21,10 +21,6 @@ void WebApiNetworkClass::init(AsyncWebServer& server)
_server->on("/api/network/config", HTTP_POST, std::bind(&WebApiNetworkClass::onNetworkAdminPost, this, _1)); _server->on("/api/network/config", HTTP_POST, std::bind(&WebApiNetworkClass::onNetworkAdminPost, this, _1));
} }
void WebApiNetworkClass::loop()
{
}
void WebApiNetworkClass::onNetworkStatus(AsyncWebServerRequest* request) void WebApiNetworkClass::onNetworkStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {
@ -246,4 +242,4 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request)
NetworkSettings.enableAdminMode(); NetworkSettings.enableAdminMode();
NetworkSettings.applyConfig(); NetworkSettings.applyConfig();
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_ntp.h" #include "WebApi_ntp.h"
#include "Configuration.h" #include "Configuration.h"
@ -11,7 +11,7 @@
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiNtpClass::init(AsyncWebServer& server) void WebApiNtpClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -24,10 +24,6 @@ void WebApiNtpClass::init(AsyncWebServer& server)
_server->on("/api/ntp/time", HTTP_POST, std::bind(&WebApiNtpClass::onNtpTimePost, this, _1)); _server->on("/api/ntp/time", HTTP_POST, std::bind(&WebApiNtpClass::onNtpTimePost, this, _1));
} }
void WebApiNtpClass::loop()
{
}
void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request) void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_power.h" #include "WebApi_power.h"
#include "WebApi.h" #include "WebApi.h"
@ -8,7 +8,7 @@
#include <AsyncJson.h> #include <AsyncJson.h>
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiPowerClass::init(AsyncWebServer& server) void WebApiPowerClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -18,10 +18,6 @@ void WebApiPowerClass::init(AsyncWebServer& server)
_server->on("/api/power/config", HTTP_POST, std::bind(&WebApiPowerClass::onPowerPost, this, _1)); _server->on("/api/power/config", HTTP_POST, std::bind(&WebApiPowerClass::onPowerPost, this, _1));
} }
void WebApiPowerClass::loop()
{
}
void WebApiPowerClass::onPowerStatus(AsyncWebServerRequest* request) void WebApiPowerClass::onPowerStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {
@ -132,4 +128,4 @@ void WebApiPowerClass::onPowerPost(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_prometheus.h" #include "WebApi_prometheus.h"
#include "Configuration.h" #include "Configuration.h"
@ -10,7 +10,7 @@
#include "WebApi.h" #include "WebApi.h"
#include <Hoymiles.h> #include <Hoymiles.h>
void WebApiPrometheusClass::init(AsyncWebServer& server) void WebApiPrometheusClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -19,10 +19,6 @@ void WebApiPrometheusClass::init(AsyncWebServer& server)
_server->on("/api/prometheus/metrics", HTTP_GET, std::bind(&WebApiPrometheusClass::onPrometheusMetricsGet, this, _1)); _server->on("/api/prometheus/metrics", HTTP_GET, std::bind(&WebApiPrometheusClass::onPrometheusMetricsGet, this, _1));
} }
void WebApiPrometheusClass::loop()
{
}
void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* request) void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_security.h" #include "WebApi_security.h"
#include "Configuration.h" #include "Configuration.h"
@ -9,7 +9,7 @@
#include "helper.h" #include "helper.h"
#include <AsyncJson.h> #include <AsyncJson.h>
void WebApiSecurityClass::init(AsyncWebServer& server) void WebApiSecurityClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -20,10 +20,6 @@ void WebApiSecurityClass::init(AsyncWebServer& server)
_server->on("/api/security/authenticate", HTTP_GET, std::bind(&WebApiSecurityClass::onAuthenticateGet, this, _1)); _server->on("/api/security/authenticate", HTTP_GET, std::bind(&WebApiSecurityClass::onAuthenticateGet, this, _1));
} }
void WebApiSecurityClass::loop()
{
}
void WebApiSecurityClass::onSecurityGet(AsyncWebServerRequest* request) void WebApiSecurityClass::onSecurityGet(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentials(request)) { if (!WebApi.checkCredentials(request)) {
@ -122,4 +118,4 @@ void WebApiSecurityClass::onAuthenticateGet(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_sysstatus.h" #include "WebApi_sysstatus.h"
#include "Configuration.h" #include "Configuration.h"
@ -16,7 +16,7 @@
#define AUTO_GIT_HASH "" #define AUTO_GIT_HASH ""
#endif #endif
void WebApiSysstatusClass::init(AsyncWebServer& server) void WebApiSysstatusClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
@ -25,10 +25,6 @@ void WebApiSysstatusClass::init(AsyncWebServer& server)
_server->on("/api/system/status", HTTP_GET, std::bind(&WebApiSysstatusClass::onSystemStatus, this, _1)); _server->on("/api/system/status", HTTP_GET, std::bind(&WebApiSysstatusClass::onSystemStatus, this, _1));
} }
void WebApiSysstatusClass::loop()
{
}
void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request) void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request)
{ {
if (!WebApi.checkCredentialsReadonly(request)) { if (!WebApi.checkCredentialsReadonly(request)) {
@ -82,4 +78,4 @@ void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_webapp.h" #include "WebApi_webapp.h"
@ -22,7 +22,7 @@ extern const uint8_t file_site_webmanifest_end[] asm("_binary_webapp_dist_site_w
#define ETAG_HTTP_HEADER_VAL "\"" AUTO_GIT_HASH "\"" // ETag value must be between quotes #define ETAG_HTTP_HEADER_VAL "\"" AUTO_GIT_HASH "\"" // ETag value must be between quotes
#endif #endif
void WebApiWebappClass::init(AsyncWebServer& server) void WebApiWebappClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
_server = &server; _server = &server;
@ -94,7 +94,3 @@ void WebApiWebappClass::init(AsyncWebServer& server)
request->send(response); request->send(response);
}); });
} }
void WebApiWebappClass::loop()
{
}

View File

@ -1,37 +1,39 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_ws_console.h" #include "WebApi_ws_console.h"
#include "Configuration.h" #include "Configuration.h"
#include "MessageOutput.h" #include "MessageOutput.h"
#include "WebApi.h" #include "WebApi.h"
#include "defaults.h" #include "defaults.h"
WebApiWsConsoleClass::WebApiWsConsoleClass() WebApiWsConsoleClass::WebApiWsConsoleClass()
: _ws("/console") : _ws("/console")
{ {
} }
void WebApiWsConsoleClass::init(AsyncWebServer& server) void WebApiWsConsoleClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
_server = &server; _server = &server;
_server->addHandler(&_ws); _server->addHandler(&_ws);
MessageOutput.register_ws_output(&_ws); MessageOutput.register_ws_output(&_ws);
}
scheduler.addTask(_wsCleanupTask);
void WebApiWsConsoleClass::loop() _wsCleanupTask.setCallback(std::bind(&WebApiWsConsoleClass::wsCleanupTaskCb, this));
{ _wsCleanupTask.setIterations(TASK_FOREVER);
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients _wsCleanupTask.setInterval(1 * TASK_SECOND);
if (millis() - _lastWsCleanup > 1000) { _wsCleanupTask.enable();
_ws.cleanupClients(); }
if (Configuration.get().Security.AllowReadonly) { void WebApiWsConsoleClass::wsCleanupTaskCb()
_ws.setAuthentication("", ""); {
} else { // see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password); _ws.cleanupClients();
}
if (Configuration.get().Security.AllowReadonly) {
_lastWsCleanup = millis(); _ws.setAuthentication("", "");
} } else {
} _ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password);
}
}

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /*
* Copyright (C) 2022-2023 Thomas Basler and others * Copyright (C) 2022-2024 Thomas Basler and others
*/ */
#include "WebApi_ws_live.h" #include "WebApi_ws_live.h"
#include "Configuration.h" #include "Configuration.h"
@ -16,7 +16,7 @@ WebApiWsLiveClass::WebApiWsLiveClass()
{ {
} }
void WebApiWsLiveClass::init(AsyncWebServer& server) void WebApiWsLiveClass::init(AsyncWebServer& server, Scheduler& scheduler)
{ {
using std::placeholders::_1; using std::placeholders::_1;
using std::placeholders::_2; using std::placeholders::_2;
@ -30,26 +30,33 @@ void WebApiWsLiveClass::init(AsyncWebServer& server)
_server->addHandler(&_ws); _server->addHandler(&_ws);
_ws.onEvent(std::bind(&WebApiWsLiveClass::onWebsocketEvent, this, _1, _2, _3, _4, _5, _6)); _ws.onEvent(std::bind(&WebApiWsLiveClass::onWebsocketEvent, this, _1, _2, _3, _4, _5, _6));
scheduler.addTask(_wsCleanupTask);
_wsCleanupTask.setCallback(std::bind(&WebApiWsLiveClass::wsCleanupTaskCb, this));
_wsCleanupTask.setIterations(TASK_FOREVER);
_wsCleanupTask.setInterval(1 * TASK_SECOND);
_wsCleanupTask.enable();
scheduler.addTask(_sendDataTask);
_sendDataTask.setCallback(std::bind(&WebApiWsLiveClass::sendDataTaskCb, this));
_sendDataTask.setIterations(TASK_FOREVER);
_sendDataTask.setInterval(1 * TASK_SECOND);
_sendDataTask.enable();
} }
void WebApiWsLiveClass::loop() void WebApiWsLiveClass::wsCleanupTaskCb()
{ {
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients // see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
if (millis() - _lastWsCleanup > 1000) { _ws.cleanupClients();
_ws.cleanupClients(); }
_lastWsCleanup = millis();
}
void WebApiWsLiveClass::sendDataTaskCb()
{
// do nothing if no WS client is connected // do nothing if no WS client is connected
if (_ws.count() == 0) { if (_ws.count() == 0) {
return; return;
} }
if (millis() - _lastInvUpdateCheck < 1000) {
return;
}
_lastInvUpdateCheck = millis();
uint32_t maxTimeStamp = 0; uint32_t maxTimeStamp = 0;
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
auto inv = Hoymiles.getInverterByPos(i); auto inv = Hoymiles.getInverterByPos(i);
@ -236,4 +243,4 @@ void WebApiWsLiveClass::onLivedataStatus(AsyncWebServerRequest* request)
MessageOutput.printf("Unknown exception in /api/livedata/status. Reason: \"%s\".\r\n", exc.what()); MessageOutput.printf("Unknown exception in /api/livedata/status. Reason: \"%s\".\r\n", exc.what());
WebApi.sendTooManyRequests(request); WebApi.sendTooManyRequests(request);
} }
} }