softwarecrash / Daly2MQTT

ESP8266 Connector to get Daly / XENES / HI-BMS / BullTron BMS Data into MQTT systems
Other
149 stars 32 forks source link

öfters sporadische restart nach--> sending several AJAX requests at once from the frontend can cause the overload. #131

Closed StefanKie closed 1 year ago

StefanKie commented 1 year ago

Is there an existing issue for this?

Used Hardware?

Wemos D1 Mini

What happened?

öfters sporadische restart nach --> sending several AJAX requests at once from the frontend can cause the overload.

To see whether this is the case, try printing the result of ESP.getFreeHeap() at various points in your loop. If it falls much below 10kb, there is a risk that another request will drive it over the edge. Das habe ich behoben durch: void notifyClients() { if (wsClient != nullptr && wsClient->canSend()) { if (ESP.getFreeHeap() > 33000) // { DEBUG_PRINT(F("Info: Data sent to WebSocket... ")); char data[JSON_BUFFER]; size_t len = serializeJson(bmsJson, data); wsClient->text(data, len); DEBUG_PRINT(F("Done\n")); } } }

void onEvent(AsyncWebSocket server, AsyncWebSocketClient client, AwsEventType type, void arg, uint8_t data, size_t len) { if (ESP.getFreeHeap() > 33000) { switch (type) { case WS_EVT_CONNECT: wsClient = client; getJsonDevice(); getJsonData(); notifyClients(); break; case WS_EVT_DISCONNECT: wsClient = nullptr; break; case WS_EVT_DATA: handleWebSocketMessage(arg, data, len); break; case WS_EVT_PONG: case WS_EVT_ERROR: break; } }

void loop() { // Make sure wifi is in the right mode if (WiFi.status() == WL_CONNECTED) { if (ESP.getFreeHeap() > 33000) { -->> hier die komplette LOOP

Screenshots / Fotos

.

Steps To Reproduce

.

Version

2.x.x and above

Relevant livejson output

.

Which BMS is connected?

200A

What browsers are you seeing the problem on?

Chrome

softwarecrash commented 1 year ago

Hallo, den ganzen loop an die bedingung des heap zu hängen halte ich nicht für den besten weg. websocket clients sollten automatisch bereinigt werden, die lassen den heap schrumpfen, das ist in der aktuellen version vorhanden. wenn sollte man die anzahl der ajax requests begrenzen. das ganze ist eigentlich auch nicht dafür gedacht das man das webUI so oft aktualisiert bis der webserver abstürzt

das sorgt dafür das wenn der heap kleiner 3300 ist keine daten an das webUI geliefert werden womit das hängt und ggf in ein timeout läuft

void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
{
if (ESP.getFreeHeap() > 33000)
{
switch (type)
{
case WS_EVT_CONNECT:
wsClient = client;
getJsonDevice();
getJsonData();
notifyClients();
break;
case WS_EVT_DISCONNECT:
wsClient = nullptr;
break;
case WS_EVT_DATA:
handleWebSocketMessage(arg, data, len);
break;
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
}
}

den ganzen loop auszuhelbeln ist denkbar schlecht, wenn aus irgendeinem grund der heap sinkt, funktioniert kein failsave, relais, etc mehr

void loop()
{
// Make sure wifi is in the right mode
if (WiFi.status() == WL_CONNECTED)
{
if (ESP.getFreeHeap() > 33000)
{
-->> hier die komplette LOOP

EDIT: hab das gerade mal versucht nachzustellen, der ESP stürzt nicht ab egal wie oft und schnell man das webUi aktualisiert

github-actions[bot] commented 1 year ago

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] commented 1 year ago

This issue was closed because it has been inactive for 14 days since being marked as stale.