Improoved websocket handling

This commit is contained in:
Thomas Basler 2022-06-17 13:29:21 +02:00
parent f1566eaab7
commit 46d88c6520
2 changed files with 30 additions and 6 deletions

View File

@ -12,4 +12,8 @@ public:
private: private:
AsyncWebSocket* _ws; AsyncWebSocket* _ws;
void addField(JsonDocument& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId); void addField(JsonDocument& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId);
uint32_t _lastWsPublish = 0;
uint32_t _lastInvUpdateCheck = 0;
uint32_t _newestInverterTimestamp = 0;
}; };

View File

@ -1,7 +1,6 @@
#include "WebApi_ws_live.h" #include "WebApi_ws_live.h"
#include "AsyncJson.h" #include "AsyncJson.h"
#include "Configuration.h" #include "Configuration.h"
#include <Every.h>
void WebApiWsLiveClass::init(AsyncWebSocket* ws) void WebApiWsLiveClass::init(AsyncWebSocket* ws)
{ {
@ -10,13 +9,28 @@ void WebApiWsLiveClass::init(AsyncWebSocket* ws)
void WebApiWsLiveClass::loop() void WebApiWsLiveClass::loop()
{ {
EVERY_N_SECONDS(10)
{
// 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;
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
auto inv = Hoymiles.getInverterByPos(i);
if (inv->getLastStatsUpdate() > maxTimeStamp) {
maxTimeStamp = inv->getLastStatsUpdate();
}
}
// Update on every inverter change or at least after 10 seconds
if (millis() - _lastWsPublish > (10 * 1000) || (maxTimeStamp != _newestInverterTimestamp)) {
DynamicJsonDocument root(40960); DynamicJsonDocument root(40960);
// Loop all inverters // Loop all inverters
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
@ -48,6 +62,10 @@ void WebApiWsLiveClass::loop()
addField(root, i, inv, c, FLD_EFF); addField(root, i, inv, c, FLD_EFF);
addField(root, i, inv, c, FLD_IRR); addField(root, i, inv, c, FLD_IRR);
} }
if (inv->getLastStatsUpdate() > _newestInverterTimestamp) {
_newestInverterTimestamp = inv->getLastStatsUpdate();
}
} }
size_t len = measureJson(root); size_t len = measureJson(root);
@ -56,6 +74,8 @@ void WebApiWsLiveClass::loop()
serializeJson(root, (char*)buffer->get(), len + 1); serializeJson(root, (char*)buffer->get(), len + 1);
_ws->textAll(buffer); _ws->textAll(buffer);
} }
_lastWsPublish = millis();
} }
} }