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!");
private:
void loop();
Task _loopTask;
AsyncWebServer _server;
WebApiConfigClass _webApiConfig;
@ -66,4 +62,4 @@ private:
WebApiWsLiveClass _webApiWsLive;
};
extern WebApiClass WebApi;
extern WebApiClass WebApi;

View File

@ -2,11 +2,11 @@
#pragma once
#include <ESPAsyncWebServer.h>
#include <TaskSchedulerDeclarations.h>
class WebApiConfigClass {
public:
void init(AsyncWebServer& server);
void loop();
void init(AsyncWebServer& server, Scheduler& scheduler);
private:
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);
AsyncWebServer* _server;
};
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,12 +4,12 @@
#include <ArduinoJson.h>
#include <ESPAsyncWebServer.h>
#include <Hoymiles.h>
#include <TaskSchedulerDeclarations.h>
class WebApiWsLiveClass {
public:
WebApiWsLiveClass();
void init(AsyncWebServer& server);
void loop();
void init(AsyncWebServer& server, Scheduler& scheduler);
private:
void generateJsonResponse(JsonVariant& root);
@ -22,9 +22,13 @@ private:
AsyncWebSocket _ws;
uint32_t _lastWsPublish = 0;
uint32_t _lastInvUpdateCheck = 0;
uint32_t _lastWsCleanup = 0;
uint32_t _newestInverterTimestamp = 0;
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
/*
* Copyright (C) 2022-2023 Thomas Basler and others
* Copyright (C) 2022-2024 Thomas Basler and others
*/
#include "WebApi.h"
#include "Configuration.h"
@ -14,56 +14,28 @@ WebApiClass::WebApiClass()
void WebApiClass::init(Scheduler& scheduler)
{
_webApiConfig.init(_server);
_webApiDevice.init(_server);
_webApiDevInfo.init(_server);
_webApiDtu.init(_server);
_webApiEventlog.init(_server);
_webApiFirmware.init(_server);
_webApiGridprofile.init(_server);
_webApiInverter.init(_server);
_webApiLimit.init(_server);
_webApiMaintenance.init(_server);
_webApiMqtt.init(_server);
_webApiNetwork.init(_server);
_webApiNtp.init(_server);
_webApiPower.init(_server);
_webApiPrometheus.init(_server);
_webApiSecurity.init(_server);
_webApiSysstatus.init(_server);
_webApiWebapp.init(_server);
_webApiWsConsole.init(_server);
_webApiWsLive.init(_server);
_webApiConfig.init(_server, scheduler);
_webApiDevice.init(_server, scheduler);
_webApiDevInfo.init(_server, scheduler);
_webApiDtu.init(_server, scheduler);
_webApiEventlog.init(_server, scheduler);
_webApiFirmware.init(_server, scheduler);
_webApiGridprofile.init(_server, scheduler);
_webApiInverter.init(_server, scheduler);
_webApiLimit.init(_server, scheduler);
_webApiMaintenance.init(_server, scheduler);
_webApiMqtt.init(_server, scheduler);
_webApiNetwork.init(_server, scheduler);
_webApiNtp.init(_server, scheduler);
_webApiPower.init(_server, scheduler);
_webApiPrometheus.init(_server, scheduler);
_webApiSecurity.init(_server, scheduler);
_webApiSysstatus.init(_server, scheduler);
_webApiWebapp.init(_server, scheduler);
_webApiWsConsole.init(_server, scheduler);
_webApiWsLive.init(_server, scheduler);
_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)
@ -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
/*
* Copyright (C) 2022-2023 Thomas Basler and others
* Copyright (C) 2022-2024 Thomas Basler and others
*/
#include "WebApi_config.h"
#include "Configuration.h"
@ -10,7 +10,7 @@
#include <AsyncJson.h>
#include <LittleFS.h>
void WebApiConfigClass::init(AsyncWebServer& server)
void WebApiConfigClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
using std::placeholders::_1;
using std::placeholders::_2;
@ -29,10 +29,6 @@ void WebApiConfigClass::init(AsyncWebServer& server)
std::bind(&WebApiConfigClass::onConfigUpload, this, _1, _2, _3, _4, _5, _6));
}
void WebApiConfigClass::loop()
{
}
void WebApiConfigClass::onConfigGet(AsyncWebServerRequest* 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
request->_tempFile.close();
}
}
}

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -12,7 +12,7 @@
#include "helper.h"
#include <AsyncJson.h>
void WebApiDeviceClass::init(AsyncWebServer& server)
void WebApiDeviceClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiDeviceClass::loop()
{
}
void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentials(request)) {

View File

@ -1,6 +1,6 @@
// 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.h"
@ -8,7 +8,7 @@
#include <Hoymiles.h>
#include <ctime>
void WebApiDevInfoClass::init(AsyncWebServer& server)
void WebApiDevInfoClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiDevInfoClass::loop()
{
}
void WebApiDevInfoClass::onDevInfoStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -9,7 +9,7 @@
#include <AsyncJson.h>
#include <Hoymiles.h>
void WebApiDtuClass::init(AsyncWebServer& server)
void WebApiDtuClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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_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
CONFIG_T& config = Configuration.get();
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel);
Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel);
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial);
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial);
Hoymiles.getRadioCmt()->setCountryMode(static_cast<CountryModeId_t>(config.Dtu.Cmt.CountryMode));
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
Hoymiles.setPollInterval(config.Dtu.PollInterval);
_performReload = false;
}
// Execute stuff in main thread to avoid busy SPI bus
CONFIG_T& config = Configuration.get();
Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel);
Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel);
Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial);
Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial);
Hoymiles.getRadioCmt()->setCountryMode(static_cast<CountryModeId_t>(config.Dtu.Cmt.CountryMode));
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
Hoymiles.setPollInterval(config.Dtu.PollInterval);
}
void WebApiDtuClass::onDtuAdminGet(AsyncWebServerRequest* request)
@ -196,5 +197,5 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
_performReload = true;
_applyDataTask.enable();
}

View File

@ -1,13 +1,13 @@
// 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.h"
#include <AsyncJson.h>
#include <Hoymiles.h>
void WebApiEventlogClass::init(AsyncWebServer& server)
void WebApiEventlogClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiEventlogClass::loop()
{
}
void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {
@ -70,4 +66,4 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -10,7 +10,7 @@
#include "helper.h"
#include <AsyncJson.h>
void WebApiFirmwareClass::init(AsyncWebServer& server)
void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
using std::placeholders::_1;
using std::placeholders::_2;
@ -26,10 +26,6 @@ void WebApiFirmwareClass::init(AsyncWebServer& server)
std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6));
}
void WebApiFirmwareClass::loop()
{
}
void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentials(request)) {
@ -83,4 +79,4 @@ void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request,
} else {
return;
}
}
}

View File

@ -1,13 +1,13 @@
// 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.h"
#include <AsyncJson.h>
#include <Hoymiles.h>
void WebApiGridProfileClass::init(AsyncWebServer& server)
void WebApiGridProfileClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiGridProfileClass::loop()
{
}
void WebApiGridProfileClass::onGridProfileStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {
@ -91,4 +87,4 @@ void WebApiGridProfileClass::onGridProfileRawdata(AsyncWebServerRequest* request
response->setLength();
request->send(response);
}
}

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -12,7 +12,7 @@
#include <AsyncJson.h>
#include <Hoymiles.h>
void WebApiInverterClass::init(AsyncWebServer& server)
void WebApiInverterClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiInverterClass::loop()
{
}
void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentials(request)) {
@ -460,4 +456,4 @@ void WebApiInverterClass::onInverterOrder(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}

View File

@ -1,6 +1,6 @@
// 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.h"
@ -10,7 +10,7 @@
#include <AsyncJson.h>
#include <Hoymiles.h>
void WebApiLimitClass::init(AsyncWebServer& server)
void WebApiLimitClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiLimitClass::loop()
{
}
void WebApiLimitClass::onLimitStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {
@ -156,4 +152,4 @@ void WebApiLimitClass::onLimitPost(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}

View File

@ -1,6 +1,6 @@
// 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"
@ -9,7 +9,7 @@
#include "WebApi_errors.h"
#include <AsyncJson.h>
void WebApiMaintenanceClass::init(AsyncWebServer& server)
void WebApiMaintenanceClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiMaintenanceClass::loop()
{
}
void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentials(request)) {
@ -84,4 +80,4 @@ void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}
}

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -11,7 +11,7 @@
#include "helper.h"
#include <AsyncJson.h>
void WebApiMqttClass::init(AsyncWebServer& server)
void WebApiMqttClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiMqttClass::loop()
{
}
void WebApiMqttClass::onMqttStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -10,7 +10,7 @@
#include "helper.h"
#include <AsyncJson.h>
void WebApiNetworkClass::init(AsyncWebServer& server)
void WebApiNetworkClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiNetworkClass::loop()
{
}
void WebApiNetworkClass::onNetworkStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {
@ -246,4 +242,4 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request)
NetworkSettings.enableAdminMode();
NetworkSettings.applyConfig();
}
}

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -11,7 +11,7 @@
#include "helper.h"
#include <AsyncJson.h>
void WebApiNtpClass::init(AsyncWebServer& server)
void WebApiNtpClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiNtpClass::loop()
{
}
void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -1,6 +1,6 @@
// 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.h"
@ -8,7 +8,7 @@
#include <AsyncJson.h>
#include <Hoymiles.h>
void WebApiPowerClass::init(AsyncWebServer& server)
void WebApiPowerClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiPowerClass::loop()
{
}
void WebApiPowerClass::onPowerStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {
@ -132,4 +128,4 @@ void WebApiPowerClass::onPowerPost(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}

View File

@ -1,7 +1,7 @@
// 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 "Configuration.h"
@ -10,7 +10,7 @@
#include "WebApi.h"
#include <Hoymiles.h>
void WebApiPrometheusClass::init(AsyncWebServer& server)
void WebApiPrometheusClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiPrometheusClass::loop()
{
}
void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -9,7 +9,7 @@
#include "helper.h"
#include <AsyncJson.h>
void WebApiSecurityClass::init(AsyncWebServer& server)
void WebApiSecurityClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiSecurityClass::loop()
{
}
void WebApiSecurityClass::onSecurityGet(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentials(request)) {
@ -122,4 +118,4 @@ void WebApiSecurityClass::onAuthenticateGet(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}

View File

@ -1,6 +1,6 @@
// 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 "Configuration.h"
@ -16,7 +16,7 @@
#define AUTO_GIT_HASH ""
#endif
void WebApiSysstatusClass::init(AsyncWebServer& server)
void WebApiSysstatusClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
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));
}
void WebApiSysstatusClass::loop()
{
}
void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request)
{
if (!WebApi.checkCredentialsReadonly(request)) {
@ -82,4 +78,4 @@ void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request)
response->setLength();
request->send(response);
}
}

View File

@ -1,6 +1,6 @@
// 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"
@ -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
#endif
void WebApiWebappClass::init(AsyncWebServer& server)
void WebApiWebappClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
_server = &server;
@ -94,7 +94,3 @@ void WebApiWebappClass::init(AsyncWebServer& server)
request->send(response);
});
}
void WebApiWebappClass::loop()
{
}

View File

@ -1,37 +1,39 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022-2023 Thomas Basler and others
*/
#include "WebApi_ws_console.h"
#include "Configuration.h"
#include "MessageOutput.h"
#include "WebApi.h"
#include "defaults.h"
WebApiWsConsoleClass::WebApiWsConsoleClass()
: _ws("/console")
{
}
void WebApiWsConsoleClass::init(AsyncWebServer& server)
{
_server = &server;
_server->addHandler(&_ws);
MessageOutput.register_ws_output(&_ws);
}
void WebApiWsConsoleClass::loop()
{
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
if (millis() - _lastWsCleanup > 1000) {
_ws.cleanupClients();
if (Configuration.get().Security.AllowReadonly) {
_ws.setAuthentication("", "");
} else {
_ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password);
}
_lastWsCleanup = millis();
}
}
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022-2024 Thomas Basler and others
*/
#include "WebApi_ws_console.h"
#include "Configuration.h"
#include "MessageOutput.h"
#include "WebApi.h"
#include "defaults.h"
WebApiWsConsoleClass::WebApiWsConsoleClass()
: _ws("/console")
{
}
void WebApiWsConsoleClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
_server = &server;
_server->addHandler(&_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::wsCleanupTaskCb()
{
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
_ws.cleanupClients();
if (Configuration.get().Security.AllowReadonly) {
_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
/*
* Copyright (C) 2022-2023 Thomas Basler and others
* Copyright (C) 2022-2024 Thomas Basler and others
*/
#include "WebApi_ws_live.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::_2;
@ -30,26 +30,33 @@ void WebApiWsLiveClass::init(AsyncWebServer& server)
_server->addHandler(&_ws);
_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
if (millis() - _lastWsCleanup > 1000) {
_ws.cleanupClients();
_lastWsCleanup = millis();
}
_ws.cleanupClients();
}
void WebApiWsLiveClass::sendDataTaskCb()
{
// do nothing if no WS client is connected
if (_ws.count() == 0) {
return;
}
if (millis() - _lastInvUpdateCheck < 1000) {
return;
}
_lastInvUpdateCheck = millis();
uint32_t maxTimeStamp = 0;
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); 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());
WebApi.sendTooManyRequests(request);
}
}
}