Longpoll via WebSockets funktioniert nicht

Begonnen von Heiner33, 16 März 2019, 19:05:31

Vorheriges Thema - Nächstes Thema

Heiner33

Hallo zusammen,

nachdem ich meinen lokalen Browser-Cache der FHEM Tablet-UI Seite gelöscht habe, funktioniert der Longpoll via Websockets nicht mehr und ich erhalte den Fehler:
"longpoll: websockets not supportetd or not activated > fall back to AJAX" in der Browser Console.

Testweise habe ich ein komplettes FHEM + Tablet UI auf einem Testsystem neu aufgesetzt und lediglich in der Standard "index_empty.html" ein einziges Label eingebaut und den Debug Level auf 2 gesetzt.
Auch hier mit dem frisch installierten FHEM bekomme ich kein Longpoll via WebSockets, sondern er fällt zurück auf AJAX. Habe auch schon beim WEB Device das Attribut "longpoll" testweise auf "websocket" gesetzt, leider keine Änderung.

Gibt es hier gerade generell ein Problem mit Longpoll per Websockets? Ich ging davon aus, dass in der Standard-Konfig WebSockets genutzt wird?

Danke,
Grüße

SirMarco

Leider habe ich genau das gleiche Problem und kann es gerade nicht nachvollziehen warum.

Änderungen habe ich am tabletui  nicht gemacht

Heiner33

#2
Habe mir jetzt den Fehler mehrere Stunden angeschaut und habe folgendes herausgefunden:

Mit der fhem-tablet-ui.js (und fhem-tablet-ui.min.js) vom 26. Januar 19 (v. 2.7.10) aus Github funktioniert der Longpoll mit Websockets.
Ab der Version vom 19. Februar 19 (v.  2.7.11) funktioniert es nicht mehr.

Konnte den Fehler auf 3 Rechnern reproduzieren und durch einspielen der alten Version 2.7.10 aus Github "korrigieren".
Vermutlich liegt es an den Änderungen vom 19.02.19.

SirMarco

Danke für das Testen. Ich bin auch schon seid Wochen an dem Thema. Leider hat die Version keine Verbesserungen gebracht. Wie sieht der Header deiner index.html aus?

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Cache-Control" content="no-cache" />
<link rel="icon" href="favicon.ico" type="image/x-icon" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="lang" content="de">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="longpoll" content="1"> <!-- 1=longpoll;0=shortpoll every 30sec -->
    <meta name="longpoll_type" content="websocket">
<meta name="longpoll_filter" content=".*">
<meta name='web_device' content='WWW_FTUI'>
<meta name="toast" content='1'/>
<meta name="fhemweb_url" content="http://192.168.2.195:8001/fhem">
    <meta name="debug" content="1"> <!-- verbose level 1-6 = output to console;0 = not output -->

<link rel="stylesheet" href="css/fhem-mobil-ui.css" />
    <link rel="stylesheet" href="css/fhem-tablet-ui-user.css" />
<link rel="stylesheet" href="css/fhem-tablet-ui-usercolors-ui.css" />

<!--FONTS-->
<link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto:400,500" rel="stylesheet" type='text/css'>

<script src="js/fhem-tablet-ui.js" defer></script>
</head>

Heiner33

#4
@SirMarco:

Nur diese drei Zeilen
    <link rel="icon" href="favicon.ico" type="image/x-icon" />
<meta name="debug" content="2">
    <script src="js/fhem-tablet-ui.js" defer></script>


Bei meinem WEB device in FHEM habe ich nur das Attribut longpoll auf "websocket" gesetzt.

Wichtig ist, dass du nach dem "Downgrade" der fhem-tablet-ui.js deinen Browser Cache löscht, auch den lokalen "Storage" löscht und dann deine Tablet UI Seite besuchst. Den ersten Zugriff macht er dann noch via AJAX aber ab dem zweiten sollte er dann WebSockets nutzen!

@setstate:
Habe im Github Repository einen Pull-Request erstellt, der den Fehler beseitigt. Müsstest du evtl. noch auf Querwirkungen prüfen:
https://github.com/knowthelist/fhem-tablet-ui/pull/239

setstate

Ich bezweifle stark, dass diese Änderung etwas mit eurem Problem zu tun hat.

Was zeigt denn dieser Aufruf in der Kommandozeile der Web-Console des Browsers?

ftui.deviceStates[ftui.config.webDevice].longpoll.val

Muss 'websocket' bringen

Heiner33

Hatte zumindest mit der Änderung keine Probleme mehr.

Ein Aufruf in der Konsole bringt:
TypeError: undefined is not an object (evaluating 'ftui.deviceStates[ftui.config.webDevice].longpoll')

ftui.config.webDevice liefert korrekt "WEB", aber das ftui.deviceStates beinhaltet kein "WEB" Objekt bei mir.
Nach der beschriebenen Änderung und Löschen des lokalen Storage ist das wieder enthalten...

setstate

#7
ich habe eine Spur ...

Sooo. Update ist hochgeladen. Ich habe festgestellt, dass man die ganze Web_device Abfrage überhaupt nicht braucht. Habe ich rausgeschmissen.

Eisix

Hallo,

unter Chrome MacOS geht es schnell und ohne die "Retry to connect in 10 seconds" Meldung.
Meine Einstellungen sind


   <meta name="longpoll" content="1">
    <meta name="longpoll_type" content="websocket">
    <meta name="toast" content="1">
    <meta name='debug' content='0'>


Die gleiche Seite mit Android 6.01, aktuellem Webview und aktuellem Fully braucht mehrere Minuten zum initialen laden. Danach dauert alles ewig, nicht zu benutzen. "Retry to connect in 10 seconds" Meldung ist auch weg.

Gruß
Eisix

Heiner33

@setstate: Mein Fehler ist korrigiert mit deinem neuesten Update. Danke dir!!

Eisix

Hallo,

habe es heute nach weiteren Experimenten zum laufen gekriegt.


    <meta name="longpoll_type" content="websocket">
    <meta name="longpoll" content="1">
    <meta name="toast" content="1">
    <meta name='debug' content='0'>


Bei einem Tablet mit extrem vielen Seiten habe ich mit

    <meta http-equiv="Cache-Control" content="no-store" />

eine Verbesserung erreicht. Wer Probleme hat kann es mal versuchen.
Einen Bereich mit einem Template das 15x benutzt wurde musste ich komplett aus der Seite nehmen.

@setstate: Danke funktioniert!

Gruß
Eisix






fruemmel

Hallo,

bei mir sind die "Retry to connect in 10 seconds" jetzt auch weg. Gefühlt ist auch Fully auf einem Android-Pad schneller geworden, wenn auch immer noch recht langsam.

Ich hatte bei mir noch folgende Zeile im index.html:
<meta name="longpoll_filter" content=".*">
Damit bekam ich in der neuesten Version den Fehler Disconnected from FHEM. The connection was closed abnormally e.g. without sending or receiving a Close control frame

Nachdem ich diese Zeile auskommentiert habe, waren die Meldungen weg. Der Zusammenhang ist wohl was für die Spezialisten...

SirMarco


Eisix

Hallo,

nimm


<meta name="longpoll_filter" content=".*">
<meta name='web_device' content='WEB'>


raus.

Gruß
Eisix

setstate

#14
Mit longpoll_filter auf .* wird auf alles gelauscht und FHEM wird damit mehr zu tun haben und wird durch ein  zu schnelles Wiederverbinden gestört. Wenn man das weglässt, wird der Filter nur für die tatsächlich benötigten Device Readings automatisch zusammengebaut. Da wird der Websocket schneller mit der Etablierung der Verbindung fertig sein und für das Schließen und Wiederverbinden bereit sein.

web_device wird nicht mehr benötigt. Es wird im Code nicht mehr benutzt.