Es gibt noch ein Problem mit dem Ping. Der scheint immer wieder neu zu starten und den Status "offline" gleich wieder zu überschreiben. Ich arbeite an einer Lösung.
Ankündigung
Einklappen
Keine Ankündigung bisher.
SmartVisu verliert Verbindung bei "neuem" IPad
Einklappen
X
-
So sollte es jetzt klappen:
Angehängten Treiber austauschen und In der base.js die Startbedingungen für den Ping anpassen:
Code:var autoReconnectIntervalId = window.setInterval(function () { if (io.ping && new Date() - io.socketStateTimestamp > 600000 && io.socketState != 'pinging' && io.socketState != 'offline') io.ping(); if((io.socket != null && io.socket.readyState == 3) || io.socketState == 'offline') {
Gruß
Wolfram
EDIT: Treiber gelöscht. Aktuelle Version weiter unten im ThreadZuletzt geändert von wvhn; 20.08.2024, 10:39.
Kommentar
-
Hallo Wolfram, gute Nachrichten. Heute hat der Reconnect genau nach 10 Minuten geklappt.
Ich hatte da gerade auf dem PC die Visu offen mit der offenen Console.
Da kam zeitgleich mit dem Reconnect diese Meldung:
visu.png
Ich weiß aber nicht, ob das was miteinander zu hat...
Die Ecken werden aber nicht eingefärbt. Da habe ich noch keine Meldung gesehen.
Ich setzte jetzt mal die Zeit von 10 Minuten auf eine Minute runter.
Edit: Ecken werden angezeigt!
Grüße, MarcZuletzt geändert von schuma; 17.08.2024, 19:20.
Kommentar
-
Moin Marc,
leider verstehe ich zu wenig von den Interna der Websocket-Implementierung in Safari. Wenn der Reconnect immer genau 10 Minuten braucht, dann bedeutet das vermutlich, dass Safari beim Einschalten des iPads noch mindestens eine Meldung aus dem Puffer erhält und sich dazu den aktuellen Zeitstempel merkt. Wenn das so ist, macht die Ping-Methode in der jetzigen Form nicht so richtig Sinn - es sei denn Du stellst insgesamt fest, dass es deutlich weniger Abbrüche gibt.
Ich mach mir nochmal Gedanken. Vielleicht hast Du ja auch noch eine Idee, wie man das Verhalten von Safari besser debuggen kann?
Wenn beim Einschalten des iPads das grüne Dreieck zuverlässig erscheint, dann kannst Du den Event in der visu.js anstelle der beiden Test-Events wie folgt nutzen:
Code:$(document).on('visibilitychange', function(event) { if(document.visibilityState == 'visible') setTimeout(function(){ io.socketStateTimestamp = 0; }, 1000); });
Gruß
Wolfram
Kommentar
-
Moin Wolfram, ich teste erst einmal noch etwas. Mir fehlt noch der Fall, ob der visibilitiychange = visible auch ausgelöst wird, wenn gerade keine Verbindung gibt und trotzdem das Display angeht. Da muss ich noch abwarten und weiter beobachten.
Danach fange ich dann mal an Änderungen vorzunehmen.
Also falls die Meldung kommt, den socketStateTimestamp mit der Nachricht zu ändern.
Oder die Idee mit dem einschalten des Magneten, also über den State eines Items, den Timestamp auf 0 zu setzen.
Oder anschließend noch mal die Möglichkeit in dem Treiber "onError" auszuwerten und da was anzustoßen.
Ist leider etwas langwierig, da ja immer der Fall erst eintreten muss.
Ich jetzt zu der Meldung "vivible" jetzt auch noch mal den Timestamp Status ausgeben. Ich weiß noch nicht richtig wozu, aber eine Information mehr...
Also:
Code:notify.message('info', 'Visibility', 'Screen switched to visible - State: '+io.socket.readyState.toString());
Zuletzt geändert von schuma; 18.08.2024, 13:49.
Kommentar
-
Aktueller Zwischenbericht:
Seit gestern Mittag keine Abbrüche mehr… Mal gucken wie es weiter geht.
Was mir noch aufgefallen ist, ich habe auf dem IPad noch keinen anderen Status als 1 gesehen.
Beim Bildschirm Einschalten kommen zuverlässig die beiden Meldungen immer hintereinander. Visible false, visible true. (Allerdings gab es ja bis jetzt auch kein Abbruch mehr) Immer mit Status 1.
Status 3 habe ich bisher nur auf dem PC gesehen.
Kommentar
-
Moin Marc,
Danke für das Update. Ich bin mal gespannt, wie es weiter geht.
Die visibility hat mit dem Websocket nicht direkt etwas zu tun. Sie bietet lediglich nach meinem Wissen die einzigen programmatisch nutzbaren Events, um zu erkennen, ob die Visu auf dem iPad aktiv ist. Das kann helfen, Reconnects selbst bei einer fehlerhaften Websocket-Fehlerbehandlung des Browsers zu erzwingen.
Den Status 1 siehst Du vermutlich deshalb ausschließlich, weil der visibility event beim Einschalten als erstes abgearbeitet wird - also noch bevor die Fehlerbehandlung des Websockets den Status auf 3 setzen kann (sofern sie funktioniert).
Ich kann inzwischen wieder testen und bin noch auf ein Problem mit dem Ping gestoßen. Im Treiber muss eine Stelle geändert werden:
Code:bisher: io.send('ping'); neu: io.send({"cmd": "ping"});
Gruß
Wolfram
EDIT: Korrektur eines Schreibfehlers im Treiber -> neu hochgeladen.Angehängte DateienZuletzt geändert von wvhn; 20.08.2024, 17:40.
Kommentar
-
wvhn Bis jetzt keinerlei Abbrüche mehr…
Alles was ich an Änderung zum Master aktuell gemacht habe bzw. jetzt noch läuft:
- Den neuen Treiber (io_smarthomeng.js) kopiert
- base.js geändert (auf 3 Minuten geändert):
Code:var autoReconnectIntervalId = window.setInterval(function () { if (io.ping && new Date() - io.socketStateTimestamp > 180000 && io.socketState != 'pinging' && io.socketState != 'offline') io.ping(); if((io.socket != null && io.socket.readyState == 3) || io.socketState == 'offline') {
- Likes 1
Kommentar
-
Moin schuma,
mir war die ping-Funktion noch etwas zu komplex und ich wollte sie möglichst vollständig im Treiber umsetzen. Deshalb habe ich sie nochmal angepasst.
In der base.js wird jetzt nur noch geprüft, ob entweder der Websocket selbst den Status "closed" meldet, oder die ping-Funktion den Status "offline" liefert. Die Anpassung in der base.js ist deshalb etwas einfacher geworden:
Code:var autoReconnectIntervalId = window.setInterval(function () { if(io.socket != null && (io.socket.readyState == 3 || (io.ping && io.socketState == 'offline'))) {
Der zu v3.4 kompatible Treiber schickt jetzt einfach 3 Minuten nach der letzten empfangenen websocket message ein ping und setzt io.socketState auf "offline", wenn keine Antwort kommt. Die Zeit ist in der angehängten Datei fest auf 3 Minuten eingestellt, indem in der init()-Methode sv.config.pingInterval = 180 gesetzt wird. Dort kann man die Zeit bei Bedarf ändern.
Kannst Du das gelegentlich nochmal testen?
Zudem ist eine entsprechende Version im develop branch. Die Zeit für das ping-Kommando stellt man in der config.ini ein, indem man einen Schlüssel "ping_interval" anlegt und die Zeit in Sekunden angibt. Ohne den Schlüssel und bei Angabe von 0 als Zeit ist die Funktion abgeschaltet. Eine Aufnahme des Parameters in die config-Seite ist im Moment nicht vorgesehen. Ich gehe davon aus, dass die Funktion nur in Ausnahmefällen benötigt wird.
Gruß
WolframAngehängte Dateien
Kommentar
-
Ich habe das jetzt mal eingebaut....
Nur zu Sicherheit, das ist so richtig?
Code:function activateAutoReconnect() { if(io.socket) { var autoReconnectIntervalId = window.setInterval(function () { if(io.socket != null && (io.socket.readyState == 3 || (io.ping && io.socketState == 'offline'))) { io.ping(); if(document.visibilityState && document.visibilityState != 'hidden'){ console.log("WebSocket closed, reconnect..."); io.init(); } } }, sv.config.reconnectTime); } }
Grüße, Marc
Kommentar
Kommentar