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;

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);

View File

@ -2,11 +2,11 @@
#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);

View File

@ -2,11 +2,11 @@
#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);

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,11 +2,11 @@
#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);

View File

@ -2,11 +2,11 @@
#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);

View File

@ -2,11 +2,11 @@
#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);

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);

View File

@ -2,11 +2,11 @@
#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);

View File

@ -2,11 +2,11 @@
#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);

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);

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);

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);

View File

@ -2,11 +2,11 @@
#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);

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);

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);

View File

@ -2,11 +2,11 @@
#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);

View File

@ -2,11 +2,11 @@
#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

@ -2,16 +2,17 @@
#pragma once #pragma once
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiWsConsoleClass { class WebApiWsConsoleClass {
public: public:
WebApiWsConsoleClass(); WebApiWsConsoleClass();
void init(AsyncWebServer& server); void init(AsyncWebServer& server, Scheduler& scheduler);
void loop();
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)

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)) {

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,11 +17,14 @@ 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);
@ -31,8 +34,6 @@ void WebApiDtuClass::loop()
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)) {

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)) {

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)) {

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)) {

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)) {

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)) {

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)) {

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)) {

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)) {

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)) {

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,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_console.h" #include "WebApi_ws_console.h"
#include "Configuration.h" #include "Configuration.h"
@ -13,17 +13,22 @@ WebApiWsConsoleClass::WebApiWsConsoleClass()
{ {
} }
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);
_wsCleanupTask.setCallback(std::bind(&WebApiWsConsoleClass::wsCleanupTaskCb, this));
_wsCleanupTask.setIterations(TASK_FOREVER);
_wsCleanupTask.setInterval(1 * TASK_SECOND);
_wsCleanupTask.enable();
} }
void WebApiWsConsoleClass::loop() void WebApiWsConsoleClass::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();
if (Configuration.get().Security.AllowReadonly) { if (Configuration.get().Security.AllowReadonly) {
@ -31,7 +36,4 @@ void WebApiWsConsoleClass::loop()
} else { } else {
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password); _ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password);
} }
_lastWsCleanup = millis();
}
} }

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);