Ankündigung

Einklappen
Keine Ankündigung bisher.

SmartVisu verliert Verbindung bei "neuem" IPad

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    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.

    Kommentar


      #17
      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') {​
      (Vorsicht vor nicht druckbaren Zeichen beim Kopieren des Codes, die dann zu Fehlern führen)

      Gruß
      Wolfram

      EDIT: Treiber gelöscht. Aktuelle Version weiter unten im Thread
      Zuletzt geändert von wvhn; 20.08.2024, 10:39.

      Kommentar


        #18
        Hallo Wolfram, ich habe alles ausgetauscht, Test läuft wieder...

        Gucken wir was morgen ist.

        Grüße, Marc

        Kommentar


          #19
          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, Marc
          Zuletzt geändert von schuma; 17.08.2024, 19:20.

          Kommentar


            #20
            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);
            });​
            Das sollte die eventuelle Abarbeitung des Eingangspuffers abwarten und den Zeitstempel für den Ping dann zurücksetzen, so dass der Reconnect wesentlich schneller erfolgt.

            Gruß
            Wolfram

            Kommentar


              #21
              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());
              Gucken wir mal...
              Zuletzt geändert von schuma; 18.08.2024, 13:49.

              Kommentar


                #22
                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


                  #23
                  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"});
                  Für den Reconnect funktioniert zwar beides, aber das erste Kommando führt bei aktivem Websocket zu einem Fehler in shNG und zum Schließen und Neustart des Websockets. Ich hänge die korrigierte Version hier an und lösche die alten Versionen oben im Thread.

                  Gruß
                  Wolfram

                  EDIT: Korrektur eines Schreibfehlers im Treiber -> neu hochgeladen.
                  Angehängte Dateien
                  Zuletzt geändert von wvhn; 20.08.2024, 17:40.

                  Kommentar


                    #24
                    Moin Wolfram, der neue Treiber ist wohl wieder für Deine Dev-Umgebung. Ich habe die Änderung aber bei mir händisch eingebaut.
                    Test läuft....
                    Bisher keine weiteren Abbrüche....

                    Grüße, Marc

                    Kommentar


                      #25
                      wvhn bis heute keinerlei Abbrüche mehr. Läuft bis jetzt perfekt!

                      Ich habe jetzt aus der Visu.js die Eckengeschichte rausgenommen und gucke ob alles so bleibt.

                      Test läuft weiter…

                      Kommentar


                        #26
                        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') {​​
                        Grüße, Marc

                        Kommentar


                          #27
                          Moin, da ich jetzt keinerlei Abbrüche mehr habe und alles nun schon mehrere Tage perfekt läuft, würde ich das hier als erledigt melden.

                          wvhn übernimmst Du das dann so in die neue Version?

                          Kommentar


                            #28
                            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'))) {​
                            Es wird also nur die if-Bedingung geändert. Die oben gezeigten Änderungen sind wieder rückgängig zu machen.

                            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ß
                            Wolfram
                            Angehängte Dateien

                            Kommentar


                              #29
                              Hallo Wolfram, das teste ich die Tage gerne noch.
                              Heute werde ich aber nicht dazu kommen.

                              Grüße, Marc

                              Kommentar


                                #30
                                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);
                                    }
                                }​
                                Ansonsten läuft der Test jetzt....

                                Grüße, Marc

                                Kommentar

                                Lädt...
                                X