Websocket-Verbindung kann bei großer Datenmenge nicht wieder aufgebaut werden

Begonnen von dennisk, 01 November 2025, 08:37:30

Vorheriges Thema - Nächstes Thema

dennisk

Hallo,

ich habe schon lange (seit wann kann ich leider nicht genau sagen) ein Problem bei FHEMWEB und der Websocket-Verbindung. Ich nutze attr longpoll websocket, was hinter meinem Reverse Proxy nginx soweit auch funktioniert. Es gibt aber immer wieder das Problem, dass die Websocket-Verbindung getrennt und danach nicht wieder aufgebaut wird - nur ein Reload der gesamten Seite hilft. Mir ist aufgefallen, dass die mglw. mit der via Websocket übertragenen Datenmenge zusammenhängt. Ich erhalte z.B. über mein Auto alle 30min. diverse JSON-Daten via MQTT (mosquitto), die u.a. auch einige als base64-encodierte Bilder enthalten. Immer, wenn diese Daten übertragen werden, sehe ich oben links in FHEMWEB den schwarzen Balken mit dem Text Connection lost, trying a reconnect every 5 seconds.. In der Browser Konsole (Firefox, passiert aber auch bei anderen Browsern) sehe ich dann folgendes (nur ein Ausschnitt, geht bis zum Reload so weiter:
08:25:31.309 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
08:25:31.314 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
Firefox kann keine Verbindung zu dem Server unter wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981930.1801498%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981931304 aufbauen. fhemweb.js:1454:19
Die Verbindung zu wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981930.1801498%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981931304 wurde unterbrochen, während die Seite geladen wurde. fhemweb.js:1454:19
08:25:31.320 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
08:25:36.216 ERRMSG:< fhemweb.js:611:13
08:25:37.327 ERRMSG:< fhemweb.js:611:13
08:25:37.332 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
GET
wss://fhem.xxx.de/fhem?XHR=1&inform=type=status;filter=room=Auto2;since=1761981930.1801498;fmt=JSON&fw_id=1761980331.68416&timestamp=1761981937329
[HTTP/1.1 101 Switching Protocols 36ms]

08:25:37.599 Rcvd: ["myskoda2mqtt_xxx_user","User<br>(Backend: 2025-11-01 08:25:32, MQTT: 2025-11-01 08:25:32)","<div id=\u002...(375) fhemweb.js:611:13
08:25:37.600 Rcvd: ["myskoda2mqtt_xxx_driving_score","Aktuelle Woche: 96 Punkte<br>(Letzte Berechnung: 2025-06-11, MQTT: 2025-11-01 08:25...(426) fhemweb.js:611:13
08:25:37.600 Rcvd: ["myskoda2mqtt_xxx_maintenance","Nächste Inspektion in: 332 Tagen, 8700km<br>Nächster Ölwechsel in: 332 Tagen, 8700km<...(674) fhemweb.js:611:13
08:25:37.601 Rcvd: ["myskoda2mqtt_xxx_widget","Zustand: CLOSED, PARKED<br>Position: Straße 99, Stadt<br>(MQTT: 202...(469) fhemweb.js:611:13
08:25:37.602 Rcvd: ["myskoda2mqtt_xxx_auxiliary_heating","Status: OFF<br>Dauer: 1200 Sekunden<br>(Auto: 2025-10-31 08:07:06, Backend: 202...(881) fhemweb.js:611:13
08:25:37.602 Rcvd: ["myskoda2mqtt_xxx_health","(Auto: 2025-10-31 08:07:39, Backend: 2025-11-01 08:25:32, MQTT: 2025-11-01 08:25:32)","<di...(406) fhemweb.js:611:13
08:25:37.602 Rcvd: ["myskoda2mqtt_xxx_trip_statistics","Aktuelle Woche:<br>Entfernung: 208km<br>Fahrzeit: 286min<br>Benzinverbrauch: 6.1l...(703) fhemweb.js:611:13
08:25:38.337 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
GET
wss://fhem.xxx.de/fhem?XHR=1&inform=type=status;filter=room=Auto2;since=1761981936.73415;fmt=JSON&fw_id=1761980331.68416&timestamp=1761981938334
[HTTP/1.1 101 Switching Protocols 50ms]

08:25:38.351 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
Firefox kann keine Verbindung zu dem Server unter wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981938334 aufbauen. fhemweb.js:1454:19
Die Verbindung zu wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981938334 wurde unterbrochen, während die Seite geladen wurde. fhemweb.js:1454:19
08:25:38.358 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
08:25:43.346 ERRMSG:< fhemweb.js:611:13
08:25:43.348 ERRMSG:< fhemweb.js:611:13
08:25:44.350 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
Firefox kann keine Verbindung zu dem Server unter wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981944347 aufbauen. fhemweb.js:1454:19
08:25:44.353 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
GET
wss://fhem.xxx.de/fhem?XHR=1&inform=type=status;filter=room=Auto2;since=1761981936.73415;fmt=JSON&fw_id=1761980331.68416&timestamp=1761981944347
[HTTP/1.1 101 Switching Protocols 38ms]

Die Verbindung zu wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981944347 wurde unterbrochen, während die Seite geladen wurde. fhemweb.js:1454:19
08:25:44.364 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
Firefox kann keine Verbindung zu dem Server unter wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981944350 aufbauen. fhemweb.js:1454:19
Die Verbindung zu wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981944350 wurde unterbrochen, während die Seite geladen wurde. fhemweb.js:1454:19
08:25:44.370 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
GET
wss://fhem.xxx.de/fhem?XHR=1&inform=type=status;filter=room=Auto2;since=1761981936.73415;fmt=JSON&fw_id=1761980331.68416&timestamp=1761981944350
[HTTP/1.1 101 Switching Protocols 44ms]

08:25:49.333 ERRMSG:< fhemweb.js:611:13
08:25:49.334 ERRMSG:< fhemweb.js:611:13
08:25:50.336 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
Firefox kann keine Verbindung zu dem Server unter wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981950333 aufbauen. fhemweb.js:1454:19
08:25:50.340 Inform-channel opened (websocket) with filter room=Auto2 fhemweb.js:611:13
GET
wss://fhem.xxx.de/fhem?XHR=1&inform=type=status;filter=room=Auto2;since=1761981936.73415;fmt=JSON&fw_id=1761980331.68416&timestamp=1761981950333
[HTTP/1.1 101 Switching Protocols 81ms]

Die Verbindung zu wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981950333 wurde unterbrochen, während die Seite geladen wurde. fhemweb.js:1454:19
08:25:50.350 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
Firefox kann keine Verbindung zu dem Server unter wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981950337 aufbauen. fhemweb.js:1454:19
Die Verbindung zu wss://fhem.xxx.de/fhem?XHR=1&inform=type%3Dstatus%3Bfilter%3Droom%3DAuto2%3Bsince%3D1761981936.73415%3Bfmt%3DJSON&fw_id=1761980331.68416&timestamp=1761981950337 wurde unterbrochen, während die Seite geladen wurde. fhemweb.js:1454:19
08:25:50.356 ERRMSG:Connection lost, trying a reconnect every 5 seconds.< fhemweb.js:611:13
GET
wss://fhem.xxx.de/fhem?XHR=1&inform=type=status;filter=room=Auto2;since=1761981936.73415;fmt=JSON&fw_id=1761980331.68416&timestamp=1761981950337

Meine nginx-Config sieht so aus:
server {
    include /etc/nginx/includes/ssl.conf;
    server_name fhem.xxx.de;
    access_log /var/log/nginx/fhem.access.log;
    error_log  /var/log/nginx/fhem.error.log debug;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8083;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        access_log off;
        client_max_body_size 0;
    }
}

Kann es an der übertragenen Datenmenge liegen? Andere Updates, z.B. meiner Wetterstation, die ca. alle 16 Sekunden kommen, funktionieren problemlos und die Websocket-Verbindung bleibt bestehen. An einem Timeout kann es in meinen Augen nicht liegen, da das z.B. auch auftritt, wenn ich FHEM kurz vor dem 30-minütigen Update von meinen Fahrzeugdaten im Browser öffne, auch dann stirbt die Websocket-Verbindung und kann nicht wieder aufgebaut werden.

Hat jemand eine Idee oder ähnliche Probleme?
Wenn es noch mehr Infos braucht, bitte ich um Rückmeldung.

Viele Grüße
Dennis

rudolfkoenig

Die Voreinstellung fuer nginx websocket Timeout ist meines Wissens 60s, das kann man aber erhoehen.
Gibt es Probleme ohne nginx?
Wie gross sind denn die Daten?
Steht im FHEM log was Besonderes?

dennisk

Zitat von: rudolfkoenig am 01 November 2025, 11:24:15Die Voreinstellung fuer nginx websocket Timeout ist meines Wissens 60s, das kann man aber erhoehen.
Gibt es Probleme ohne nginx?
Wie gross sind denn die Daten?
Steht im FHEM log was Besonderes?

Wie groß die Datenmenge ist, weiß ich ehrlich gesagt nicht. Wie kann ich das am besten bestimmen? Timeout im nginx hatte ich mal testweise auf 75s,mehr geht laut Doku nicht. Ändert aber nichts. Und da wie gesagt alle ca. 16s ein Update von meiner Wetterstation kommt, kann ich mir Timeout eigentlich nicht vorstellen.
Im Log von FHEM steht dazu gar nichts, mit aktuell global verbose 3. Müsste ich verbose anpassen, um ggf. was zu sehen? Würde FHEMWEB reichen, oder global?
Ohne nginx müsste ich probieren, läuft schon lange mit. Rückmeldung dazu kommt.

dennisk


rudolfkoenig

ZitatTimeout im nginx hatte ich mal testweise auf 75s,mehr geht laut Doku nicht.
Die Stelle im Doku wuerde mich interessieren.
Ich habe den Wert mal auf 3600s gesetzt, und es mit 180s erfolgreich getestet.

ZitatIm Log von FHEM steht dazu gar nichts, mit aktuell global verbose 3. Müsste ich verbose anpassen, um ggf. was zu sehen? Würde FHEMWEB reichen, oder global?
Ich habe eine Fehlermeldung erwartet, dazu braucht man verbose nicht zu verstellen.

Wenn ein reload das Problem behebt, dann wird das Problem im Browser und oder proxy (nginx) liegen.

Gibts das Problem auch mit einem anderen Browser bzw. auf einem anderen OS?
Evtl. Inkognito-Modus probieren, da sind die Browser-Extensions normalerweise inaktiv.

dennisk

Ich meinte das hier: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout
Ist aber für diesen Fall vermutlich nicht relevant, falsch gemerkt, sorry.

Inkognito macht keinen Unterschied, Chrome, Chromium, Vivaldi und Brave getestet.


rudolfkoenig

Wenn man im FHEMWEB verbose auf 5 setzt, dann sieht man auch die Verbindungsversuche.
Woemoglich sieht man da was, wenn der Browser versucht die Verbindung neu aufzumachen.

Hast Du ein allowed gesetzt oder das allowFrom Attribut?
Welches OS ist das?

dennisk

allowed habe ich bei der nginx-variante gesetzt. Für den Test ohne nginx habe ich eine neue FHEMWEB-Instanz erstellt ohne allowed. OS sind Linux und Android. Windows teste ich, Rückmeldung folgt.

dennisk


rudolfkoenig

Kannst Du noch das FHEMWEB-verbose Experiment durchfuehren?
Weitere Idee: die grossen Readings (temporaer) in FHEM filtern, und pruefen ob das Problem damit zusammenhaengt.

Und koenntest du so ein Bild mir zur Verfuegung stellen, hier als Anhang oder per Email?

dennisk

Hab Dir gerade zwei PMs geschickt, einmal mit den Bildern (zwei fehlen, da diese sensible Infos enthalten) und einmal mit der Log-Ausgabe verbose 5 kurz vor und nach dem Verbindungsverlust.

rudolfkoenig

Nach etwas Experimentieren: die grosse Datei (1MB+) verstimmt den Browser so stark, dass es danach nichtmal versucht eine neue Verbindung aufzumachen, trotz "new WebSocket(...)".
Ich weiss nicht, wie ich das reparieren soll.

Da aber 1MByte+ an base64 encoded Bilddaten im Browser eh nicht so ideal sind, schlage ich vor stattdessen einen Link auf die Bilder zu schicken.
Das kann man z.Bsp mit dem readingList Attribut so gestalten:
  .*/images/caroblique:.* { WriteFile("www/images/caroblique.png", decode_base64($EVENT));; return {caroblique=>'<html><img style="max-width:256px" src="fhem/images/caroblique.png"></html>'} }\
  .*/images/carside:.*  { WriteFile("www/images/carside.png", decode_base64($EVENT));; return {carside=>'<html><img style="max-width:256px" src="fhem/images/carside.png"></html>'} }\
  .*/images/status:.*  { WriteFile("www/images/status.png", decode_base64($EVENT));; return {status=>'<html><img style="max-width:95px" src="fhem/images/status.png"></html>'} }

rudolfkoenig

Und mit folgender Variante aendert sich sogar das Bild:

.*/images/caroblique:.* { my $n="images/caroblique.png";; WriteFile("www/$n",decode_base64($EVENT));; return {caroblique=>"<html><img style='max-width:256px' src='fhem/$n?".time."'></html>"} }\
.*/images/carside:.* { my $n="images/carside.png";; WriteFile("www/$n",decode_base64($EVENT));; return {carside=>"<html><img style='max-width:256px' src='fhem/$n?".time."'></html>"} }\
.*/images/status:.* { my $n="images/status.png";; WriteFile("www/$n",decode_base64($EVENT));; return {status=>"<html><img style='max-width:95px' src='fhem/$n?".time."'></html>"} }