Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehler bei Websocketverbindung mit smarthomeNG

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

    Fehler bei Websocketverbindung mit smarthomeNG

    Bei Verwendung vom neuen Treiber bekomme ich immer die Meldung, dass er keine Verbindung zum smarthome.py aufbauen konnte.
    Der alte Connector funktioniert wie gewünscht - über den Desktop Web Browser.

    Über Android Chrome bekomme ich diese Meldung sowohl beim neuen als auch alten Treiber, bin daher wieder auf die 1.8.2 Version zurück.

    greets

    #2
    slammer , ich habe dies in einen neuen Thread verschoben, da es im ursprünglichen Thread etwas off topic war.

    Die Treiber sind mit allen aktuellen Browsern und auf den wesentlichen Plattformen (Windows, OSX, Android und iOS) getestet. Um den bei Dir aufgetretenen Fehler einzugrenzen, brauche ich etwas mehr Informationen über die eingesetzten Versionen von smartVISU und smarthomeNG. Auch Infos über die verwendeten Browser-Versionen und das beim Seitenaufruf verwendete Protokoll (http / https) wären hilfreich.

    Der neue smarthomeNG-Treiber hat noch ein Problem mit Browsern, die die ES12-Spezifikation (aus 2021) nicht unterstützen. Bei Chrome betrifft das Versionen kleiner als 85. Im develop ist bereits ein Fix dafür, der auch auf sehr alten Browsern läuft. Dies werde ich demnächst in einem Wartungsrelease freigeben.

    Wenn smartVISU über https:// aufgerufen wird, muss auch die Websocket-Verbindung Verschlüsselung unterstützen. Dazu muss in smarthomeNG die Verschlüsselung aktiviert sein und es müssen gültige Zertifikate für die Verbindung vorliegen und beim Browser angemeldet sein. Unter dieser Voraussetzung und mit der Annahme, dass die standardmäßigen Ports 2424 und 2425 von shNG verwendet werden, ergeben sich die Möglichkeiten der Konfiguration wie folgt:
    smarthomeNG shNG Plugin/Modul Protokolle Konfig. smartVISU
    <= v3.1
    Konfig. smartVISU
    >= v3.2
    Bemerkungen
    < v1.8.0 visu_websocket ws:// oder wss:// Port 2424 Port 2424 oder TLS-Port 2424 http oder https je nach Websocket-Protokoll
    >= v1.8.0 visu_websocket (veraltet)
    -----------------------------------
    websocket-Modul (Vorzug)
    ws:// oder wss://
    ---------------------
    ws:// und wss://
    Port 2424
    ---------------------------
    Port 2424 oder 2425
    Port 2424 oder TLS-Port 2424
    ----------------------------------------
    Port 2424 und TLS-Port 2425
    http oder https je nach Websocket-Protokoll
    ----------------------------------------------------------

    in v3.2 http und https frei wählbar
    Gruß
    Wolfram
    Zuletzt geändert von wvhn; 22.01.2022, 21:34.

    Kommentar


      #3
      Muss meine Aussage etwas präzisieren - hab am Windows Desktop idR Firefox (96.0.2 (64-bit)) in Verwendung, mit diesem funktioniert die neue Version mit altem Treiber, aber nicht mit neuem Treiber.
      Mit Chrome bekomme ich auch am Desktop mit der Version 97.0.4692.99 den gleichen Fehler wie am Smartphone - sowohl altem als auch neuem Treiber: Driver:smarthome.py Could not connect to smarthome.py server! Websocket error undefined.

      Dieses Verhalten ist bei folgenden SmarthomeNG Versionen gleich: 1.8.2 und 1.9.0 - aktuell bin ich bei 1.9.0 mit smartvisu 3.1.0

      Verwendet wird ein Apache Webserver auf einem non-default-http-port mit PHP7.4 FPM

      greets
      Zuletzt geändert von slammer; 23.01.2022, 13:51.

      Kommentar


        #4
        slammer
        ich habe die gleiche Chrome-Version auf einem Macbook installiert und kann das Verhalten nicht reproduzieren. Die Websocket-Verbindung funktioniert fehlerfrei, auch mit dem neuen shNG-Treiber. Getestete php-Versionen: v7.3.31 und v8.0.3.

        Wichtig:
        • die beiden Treiber io_smarthome.py.js (Config-Menü "smarthomeNG") und io_smarthomeng.js (Config-Menü "smarthomeNG new") aus dem Paket smartVISU v3.2 sind nur mit v3.2 kompatibel und laufen nicht mit v3.1. Grund ist, dass die Adress-Parameter nicht mehr im Funktionsaufruf übergeben werden, sondern in einem global verfügbaren JavaScript-Objekt "sv.config" zur Verfügung stehen. Das gilt übringens für alle Backend-Treiber in v3.2.
        • smartVISU muss entweder über eine IPv4-Adresse aufgerufen werden, oder über einen Hostnamen. Wenn letzteres der Fall ist, ist der Hostname von smartVISU im entsprechenden Block auf der Config-Seite einzutragen. Näheres siehe hier. In beiden Fällen müssen IPv4-Adresse oder Hostname des shNG-Systems und die Ports im Block "Datenverbindung / Treiber" eingetragen sein.
        In dem globalen JavaScript-Objekt liegt möglicherweise eine Schwachstelle, denn dieses wird serverseitig aus php heraus befüllt (./lib/base/base.php). Es gibt bisher keine Hinweise auf Timing-Probleme, aber denkbar wäre, dass das Objekt nicht rechtzeitig befüllt ist, wenn der Treiber gestartet wird.

        Hast Du eine Chance, dies bei Dir zu debuggen? Im develop branch gibt es mit ./pages/base/driver_debug.html auch eine Seite die man auf dem Smartphone aufrufen kann (...index.php?page=driver_debug) und die alle wesentlichen Parameter anzeigt. Das ist zumindest ein kleiner Ersatz für die fehlenden Developer Tools im Browser.

        Gruß
        Wolfram

        Kommentar


          #5
          Bin mir nicht sicher ob wir hier so einfach zu einer Lösung kommen.
          Über die Debugseite werden eigentlich alle Parameter angezeigt die auch eingetragen sind.
          driver_debug.png

          Hab das Ganze nun testweise unter nginx und php8-fpm laufen, hier hab ich wieder ein anderes Verhalten.
          Firefox kann sich hier weder mit altem noch neuem Treiber Verbinden, Chrome funktioniert mit dem Altem aber nicht mit dem Neuem.

          Hab aber generell noch ein Thema mit php8-fpm, dort mag der Kalender nicht mehr angezeigt werden (keine Fehlermeldung).

          greets

          Kommentar


            #6

            Wie oben geschrieben: Du musst „smartvisu.lan“ als smartVISU Hostname eintragen, damit der neue Treiber dies als gültige interne Adresse erkennt.​ Sonst interpretiert der Treiber dies als Domain und fragt auf dem http-Port an. Dass das geschieht, sieht man auf der driver_debug Seite deutlich.

            Den Kalender kannst Du debuggen, indem Du ihn direkt aufrufst, also in der Browser-Adresszeile z.B:
            Code:
            http://smartvisu.lan:500/smartVISU/lib/calendar/service/iCloud.php?debug=1
            eingibst. Verwendest Du einen anderen Service, musst Du den statt iCloud.php eintragen.

            Es wäre klasse, wenn wir gemeinsam das Problem mit php8-fpm finden könnten, so dass wir einen Workaround beschreiben oder ich das im Code abfangen kann. Leider habe ich derzeit keine Möglichkeit, ein System mit php8-fpm aufzusetzen.

            Gruß
            Wolfram

            Kommentar


              #7
              Bleiben wir dann mal vorerst beim Thema neuer Treiber.
              Wenn ich die Website via IP aufrufe, hab ich das selbe Problem - es kommt die Meldung: Could not connect to smarthomeNG server! Websocket error undefined.
              In der config.ini steht der Parameter sv_hostname = "smartvisu.lan" - die driver_debug Seite listet das allerdings unter "sv.config.hosstname:" nicht auf

              Hab geprüft ob ein Aufruf via http-Port 80 erfolgt, kann ich verneinen - da erfolgt vom Client weder ein Zugriff auf 80/443/2424 noch 2425 (egal ob mit IP oder Hostnamen aufgerufen)

              Zusatzinfo: Das Thema mit dem Kalender funktioniert nun, allerdings wüsste ich nicht, dass ich in dem Bereich etwas geändert habe, dh. unter php8-fpm somit doch kein Problem.
              Zusatzinfo2: ok - solang der Kalender scheinbar nicht runtergeladen werden muss, wird er angezeigt - da dürfte in dem von mir verwendeten googleV3.php ein Thema sein, welches mit php8 womöglich nicht tut - es scheitert am curl_init(). Hier muss ich gucken ob ich das mitgelieferte googleV3.php ans laufen bekomme.

              greets
              Zuletzt geändert von slammer; 27.01.2022, 12:42.

              Kommentar


                #8
                slammer
                Ich hab ne Weile gebraucht, um das Problem zu verstehen. Der neue Treiber hat bisher nicht berücksichtigt, dass jemand eine Portnummer in der Adresse angibt. Wenn Du den Treiber ./drivers/smarthomeng.js geringfügig anpasst, so dass in den Zeilen 77-79 folgendes steht:
                Code:
                if (!$.isNumeric(location.hostname.split('.').join(''))) {  // replaceAll() does not work for old browsers
                    if ( location.hostname != sv.config.svHostname )
                        io.address = '';
                }
                dann wird auch eine IP-Adresse mit Port als solche erkannt (erste Zeile) und der Vergleich der Hostnamen funktioniert auch mit Port (zweite Zeile).

                Ich warte auf Deine Bestätigung, bevor ich die Änderung in den develop branch pushe. Die Version von "driver_debug" ist im develop korrigiert,

                Gruß
                Wolfram
                Zuletzt geändert von wvhn; 04.02.2022, 13:59. Grund: Zeilennummern korrigiert

                Kommentar


                  #9
                  Ich habe auch das Problem, dass die Verbinung mit SMartVISU 3.2 nicht so recht klappen mag. Durch den Einsatz von NGINX musste ich mir ohnehin immer eine eigene io_smarthomeng.js anpassen. Seit der 3er Version ging das aber nicht mehr so recht.

                  Das habe ich eingebaut, damit es wenigstens "lokal" läuft:

                  Zitat von wvhn slammer wvhn Beitrag anzeigen
                  if (!$.isNumeric(location.hostname.split('.').join('' ))) { // replaceAll() does not work for old browsers if ( location.hostname != sv.config.svHostname ) io.address = ''; }
                  Variante 1: Aufruf mit http://192.168.1.30:8080/smartVISU/
                  Geht soweit, nur Google Calendar geht nicht mehr seit dem Update. Das ist aber ein separates Problem, was ich sicherlich durch eine neue Autorisierung lösen kann.

                  Variante 2: Aufruf über die DynIP der Firtzbox: https://xxxxxxxxxxxxxx.myfritz.net:1443/smartVISU/
                  Auch mit Anpassung des SSL-Ports in dem Treiber io_.... auf 1443 geht es nicht. 443 lies sich an der Fritzbox nicht durchleiten. Deshalb ein anderer Port. Fehlermeldung hier, dass nicht an den smarthome.py server verbunden werden konnte, Websocket undefiniert. Das Problem hatte ich auch schon mit der 3.1.

                  SmartHomeNG läuft aktuell bei mir noch in der 1.8.2.

                  In den Einstellungen von SMartVISU habe ich als Host/IP die hier eingestellt: 192.168.1.30.

                  Kommentar


                    #10
                    Cannon Danke für die ausführliche Beschreibung. Ich kann leider den Remote-Zugriff bei mir nicht testen und bin daher auf Mithilfe angewiesen.
                    Kannst Du Dir aus dem aktuellen Develop mal die Seite ./pages/base/driver_debug ziehen und aufrufen? Die Ergebnisse kannst Du ja anonymisieren oder bestätigen, ob das Ergebnis gleich ist, wie unten gezeigt.
                    Alternativ: "io.address", "io.port" und "io.socket.url" in der Browser-Konsole aufrufen.

                    Wenn ich Deine Adresse bei mir simuliere, indem ich dem Treiber ein location-Objekt unterschiebe (Hostname, Port und Protokoll allerdings manuell zerlegt), dann erhalte ich folgendes Ergebnis:
                    Screenshot 2022-02-05 125651.jpg
                    Aus meiner Sicht ist das so richtig und alles weitere muss in der nginx-Konfiguration festgelegt werden. Der Reverse Proxy im nginx muss auf dem Port 1443 das Websocket-Protokoll erkennen und auf den jeweiligen Port von shNG umleiten. Wenn das Protokoll weiterhin "wss:" bleibt, muss das Websocket-Modul so eingerichtet sein, dass es verschlüsselte Kommuniation ermöglicht. D.h. der TLS-Port muss aktiviert sein und es müssen Schlüssel und Zertifikat im dafür vorgesehenen Ordner liegen.

                    Gruß
                    Wolfram

                    Kommentar


                      #11
                      Ich stelle mich irgendwie doof an. Zum einen ist es mir nicht möglich die Ausgabetexte von der SmartVISU zu markieren und kopieren. Zum anderen habe ich mal in meine plugin.yaml von SmartHomeNG geschaut. Die WebSocket habe ich gar nicht aktiviert. Das sollte über das plugin_name: smartvisu, denke ich. Ich hoffe das ist so richtig.

                      Ich schreibe mal rein, was mir die Parameter anzeigen:

                      Aufruf mit http://192.168.1.30:8080/smartVISU/
                      io.address: 192.168.1.30
                      io.port: 2424
                      WebSocket URL: ws://192.168.1.30:2424/

                      Aufruf über die DynIP der Fritzbox: https://xxxxxxxxxxxxxx.myfritz.net:1443/smartVISU/
                      io.address: xxxxxxxxxxxxxxx.myfritz.net
                      io.port: 2424
                      WebSocket URL: wss://xxxxxxxxxxxxxxx.myfritz.net:1443/

                      Aber müsste das nicht anders aussehen in Variante 2? Müsste nicht der io.Port auch 2424 sein?

                      Kommentar


                        #12
                        Das Websocket-Modul muss in der module.yaml aktiviert werden. vor shNG v1.8 gab es noch das Plugin „visu_websocket“, das jetzt veraltet ist. Wenn das nicht mehr in der plugin.yaml vorhanden ist und der Websocket trotzdem funktioniert, ist alles in Ordnung.

                        In smartVISU ist das Kopieren von Bildschirminhalten wegen unschöner Nebenwirkungen deaktiviert. Lediglich in der Doku ist das möglich. Ich schau mal, ob ich das speziell für die driver_debug Seite aktiviert bekomme.

                        In Variante 2 wird der falsche Port angezeigt. Richtig wäre 1443. Das muss ich untersuchen. Ausschlaggebend ist aber die Websocket-URL und dort ist der richtige Port angegeben. Kannst Du das nochmal checken, ob das richtig kopiert ist? Wenn die URL so stimmt, dann ist SV richtig konfiguriert und das Verbindungsproblem liegt in der Konfiguration des nginx oder des Websocket-Moduls.

                        Ob das Websocket-Modul für WSS eingerichtet ist, kannst Du prüfen, indem Du smartVISU über https: und die IP-Adresse aufrufst. Dazu muss der TLS-Port konfiguriert sein, i.d.R. 2425. Näheres siehe hier. Da Du für die DynIP bereits Schlüssel und Zertifikat hast, kannst Du Dir den Aufwand für das selbsterstellte Zertifikat sparen und musst lediglich sicher stellen, dass das shNG Websocket-Modul darauf Zugriff hat.

                        Gruß
                        Wolfram
                        Zuletzt geändert von wvhn; 06.02.2022, 12:53.

                        Kommentar


                          #13
                          Zitat von wvhn wvhn Beitrag anzeigen
                          Das Websocket-Modul muss in der module.yaml aktiviert werden
                          Ja habe ich, hatte ich vergessen. Ist schon ne Weile her.

                          Zitat von wvhn wvhn Beitrag anzeigen
                          In Variante 2 wird der falsche Port angezeigt. Richtig wäre 1443. Das muss ich untersuchen. Ausschlaggebend ist aber die Websocket-URL und dort ist der richtige Port angegeben. Kannst Du das nochmal checken, ob das richtig kopiert ist? Wenn die URL so stimmt, dann ist SV richtig konfiguriert und das Verbindungsproblem liegt in der Konfiguration des nginx oder des Websocket-Moduls.
                          Mein Fehler .. da steht natürlich 1443.

                          Zitat von wvhn wvhn Beitrag anzeigen
                          Ob das Websocket-Modul für WSS eingerichtet ist, kannst Du prüfen, indem Du smartVISU über https: und die IP-Adresse aufrufst. Dazu muss der TLS-Port konfiguriert sein, i.d.R. 2425. Näheres siehe hier. Da Du für die DynIP bereits Schlüssel und Zertifikat hast, kannst Du Dir den Aufwand für das selbsterstellte Zertifikat sparen und musst lediglich sicher stellen, dass das shNG Websocket-Modul darauf Zugriff hat.
                          Ich denke, dann liegt genau da das Problem. Dann muss ich mich da mal reinfummeln und das Zertifikat konfigurieren. Ich melde mich, sobald ich mehr weiß.

                          Kommentar


                            #14
                            Zitat von wvhn wvhn Beitrag anzeigen
                            Ob das Websocket-Modul für WSS eingerichtet ist, kannst Du prüfen, indem Du smartVISU über https: und die IP-Adresse aufrufst. Dazu muss der TLS-Port konfiguriert sein, i.d.R. 2425. Näheres siehe hier. Da Du für die DynIP bereits Schlüssel und Zertifikat hast, kannst Du Dir den Aufwand für das selbsterstellte Zertifikat sparen und musst lediglich sicher stellen, dass das shNG Websocket-Modul darauf Zugriff hat.
                            Auch, wenn das jetzt eigentlich zu SmartHomeNG gehört, aber immerhin geht es ja um dessen Anbindung an die SmartVISU. Ich sehe, dass ich die Date des Zertifikates angeben muss. Ich finde die Zertifikate aber nicht , zumindest nicht das .key. Nur das hier unter /etc/letsencrypt/live/xxxxxxxxxxxxxxx.myfritz.net/:

                            Code:
                            cert.pem  chain.pem  fullchain.pem  privkey.pem
                            Laut dem WebSocket-Modul muss ich aber ein .pem und ein .key angeben. Aber welches ist das genau? Davon abgesehen kann ich nur mit SUDO-Rechten auf den Zertifkate-Ordner zugreifen.

                            Oder geht das mit letsencryapt gar nicht und man muss doch ein eigenes mittels openssl erstellen? Ich will da auch nichts kaputt machen, nicht das da mein NGINX danach gar nicht mehr geht. Das war kompliziert genug, bis das mal lief.

                            Kommentar


                              #15
                              Hi Cannon ,

                              ich denke ich habe ein Ähnliches Setup wie Du. Bei mir funktionierte der "neue" Treiber auf Anhieb.
                              Die "wss"-Verbindung zum Websocket-Modul benötigst Du nur wenn Du lokal, in Deinem LAN, per https auf die Visu zugreifst. Lt. oben gepostetem Link auf Deine Visu greifst du lokal per http zu. Es besteht zunächst nicht die Notwendigkeit das Zertifikat in shng einzubinden.

                              Die oben genannten Werte für Port und Host sind korekt und sollten funktionieren
                              Zitat von Cannon Beitrag anzeigen
                              Aufruf über die DynIP der Fritzbox: https://xxxxxxxxxxxxxx.myfritz.net:1443/smartVISU/
                              io.address: xxxxxxxxxxxxxxx.myfritz.net
                              io.port: 1443
                              WebSocket URL: wss://xxxxxxxxxxxxxxx.myfritz.net:1443/
                              (io.port wie Du geschrieben hast auf 1443 geändert)

                              Die Informationen sehen bei mir genau so aus. Ich nehme an Du hast im alten Treiber den io.port auf 1443 umgesetzt - so hatte ich das in der Vergangenheit auch gemacht. Ich würde die Log-Einträge des NGINX mal prüfen bzw. nochmal nachschauen wie die Weiterleitung des NGINX auf die VISU bzw. das Websocket-Modul konfiguriert ist. Eventuell kannst Du den Abschnitt der NGINX-Config posten. Hat sich bei Deinem Setup etwas an den IP-Adressen von shNg bzw. der Visu geändert ?

                              Gruss Andre


                              Kommentar

                              Lädt...
                              X