Probleme mit Homegear Websocket

Hallo,
ich hab mal wieder ein Problem nach einem Update. Vielleicht kann mich jemand in die richtige Richtung stubsen…
Ich habe von Version 0.6.7-1545 auf 0.6.17-902 aktualisiert.
Nach dem Update kann ich keine Websocket Verbindung zum Homegear Webserver mehr aufbauen. Der Rest scheint zu laufen, aber es steht auch bei Loglevel 5 nichts brauchbares in den Logdateien.
Es wird wohl eine Verbindung aufgebaut, die aber dann gleich wieder getrennt wird. Im Browser ist dann in der Konsole folgende Meldung zu sehen:
Die Verbindung zu ws://192.168.2.124:2001/HomegearWS-937219ac-2595-8835-60c1-fb6fe861fc0d wurde unterbrochen, während die Seite geladen wurde.

Meine eigentliche Frage ist daher: Hat sich etwas bezüglich Websockets an Homegear innerhalb der Versionen geändert? Vermutlich kann da nur @sathya etwas zu sagen.

Bin schon einen kleinen Schritt weiter: die zugehörige Fehlermeldung lautet:

Could not decode a text frame as UTF-8.

Jetzt muss ich nur noch herausbekommen, ob das server- oder client-seitig falsch läuft. Die letzte Änderung war allerdings nur das Update, also serverseitig.

So, nachdem ich nun zwei Abende nach dem Fehler gesucht habe, bin ich mir sicher, dass der Fehler in Homgear zu suchen ist.
Der Aufruf von getAllValues über die Websocket-Schnittstelle liefert illegale Daten, sobald Zeichen außerhalb des ASCII Zeichensatzes gesendet werden müssen. Dies ist zum Beispiel der Fall, wenn getAllValues für ein HM-TC-IT-WM-W-EU der Fall, da dann die Einheit ‘°C’ mitgesendet wird. Die Websocket Verbindung wird daraufhin vom Browser mit oben genannter Fehlermeldung abgebrochen.

@sathya: Kannst Du den Fehler bestätigen (und am besten so bald wie möglich beheben (sonst muss ich mein UI umbauen)? Brauchst Du noch mehr Input von mir?

2 Likes

Hallo @DasKleingedruckte,

hmm, so ganz kann ich das Problem noch nicht nachvollziehen. Ich habe mal UTF-8-Zeichen in eine XML-Datei eingebaut und getAllValues() im HomegearWS-Beispiel aufgerufen:

Welchen Browser verwendest du? Ich habe es gerade mit den aktuellen Versionen von Chrome, Firefox und Internet Explorer getestet. Könntest du einmal probieren, ob das HomegearWS-Beispiel bei dir funktioniert? Dazu im Ordner “Example” in der “index.php” die Funktion homegearReady() durch folgende ersetzen:

function homegearReady() {
    $('.hg-alert-socket-error').remove();
    homegear.invoke("listDevices", function(message) {
        $('#log').html(JSON.stringify(message.result, null, '\t'));
        if(message.result.constructor !== Array) return;
        var ids = [];
        for(var i = 0; i < message.result.length; i++) {
            ids.push(message.result[i].ID);
        }
        homegear.addPeers(ids);
        homegear.invoke("getAllValues", function(message) {
            $('#log').html(JSON.stringify(message.result, null, '\t'));
        });
    }, false, [ 'ID', 'ADDRESS', 'FAMILY', 'TYPE' ]);
}

Viele Grüße

Sathya

Hallo @sathya,

auffällig war bei mir, dass es bei Geräten mit nicht-ASCII Zeichen, also zB dem Thermostat (Einheit °C) mit besagter Fehlermeldung abbricht (obwohl die glaube ich aus der Debug-Ausgabe von Netbeans war), während andere Geräte einwandfrei funktionieren. Änderungen an meiner Implementierung hatte ich nicht vorgenommen, sondern nur auf die aktuellste Version aktualisiert.
Ich verwende Firefox unter Ubuntu 16. Ebenso geht es mit dem Chrome-Browser unter Android nicht mehr (wo ich allerdings nichts über die Fehlermeldung sagen kann). Ich bin auch der Meinung, dass bei mir in Deinem Beispiel entweder die Client oder die Server Verbindung zum Websocket abgebrochen wurde, aber das muss ich nochmal nachschauen.
Ich hatte vor, ein simples Beispiel zu erstellen, mit dem es nachvollziehbar und reproduzierbar ist, bin allerdings aus Zeitgründen noch nicht dazu gekommen. Ich werde versuchen Dein Beispiel heute Abend einzubauen und mich mit dem Ergebnis melden. Evtl kann ich noch die Ausgaben von IE und Chrome aus einer Win7 VM nachreichen.

Gruß,
Frank

Hallo @DasKleingedruckte,

es gab ein Problem mit den Websockets, welches ich gestern behoben hatte: Der Client-Timeout lag bei 100ms. Bei Überschreiten dieser Zeit wurde die Verbindung getrennt. Kann es sein, dass das vielleicht das Problem ist? Warte mal, bis das Nightly für dein System vom 16. März ist und probiere es damit. Wenn die Verbindung dann stabil bleibt, lag es an dem zu geringen Timeout.

Viele Grüße

Sathya

Klingt gut … werde ich dann gerne testen. Bis zur 0.6.17 lief es aber auch so einwandfrei …

Das kann gut sein. Ich habe vor kurzem die Timeouts im RPC-Server reduziert, damit dieser schneller herunterfährt. Im Server wird bei einem Timeout die Verbindung aber auch nicht getrennt. Die Besonderheit bei den Websockets ist, dass der Socket von Homegears RPC-Server an den RPC-Client weitergereicht wird - mit dem geringen Timeout. Im Client wird die Verbindung beim Timeout jedoch getrennt. Genau dieses Problem habe ich gestern behoben, indem beim Transfer des Sockets das Timeout auf den Standardwert von 15 Sekunden zurückgesetzt wird.

Viele Grüße

Sathya

Danke für die Erklärung. Das klingt tatsächlich so als ob das die Ursache ist …

Gruß,
Frank

Hallo @sathya,

ich hab mir das Problem jetzt mal mit Google Chrome unter einer Win7 VM angeschaut.
Die Websocket Verbindung mit dem client-Protokoll verbindet sich ganz normal. Die Verbindung mit dem server-Protokoll bekommt allerdings sofort eine Fehlermeldung zurückgesendet:

{"user":"d5b18cb56cbd5e48f163598bfbfe20b2"}	
{"id":563,"jsonrpc":"2.0","method":"error","params":["",3,"RPC Server (Port 2001): Warning: Could not decode JSON RPC packet."]} 

Also vielleicht doch kein Timeout Problem …
Diese Meldung bekomme ich Originalzustand von HomegearWS und auch mit der modifizierten Version (so weit kommt das Skript ja nicht …)
Helfen evtl. Logdaten von Homegear bei der Diagnose?

Gruß,
Frank

Hallo @DasKleingedruckte,

hmm, das ist wirklich komisch. Ich habe gerade in einer frischen Installation des aktuellen Nightlies auf einem Raspberry Pi das HomegearWS-Beispiel getestet. Hier klappt es - sowohl auf Port 2001, als auch auf Port 2002… Auf welchem System läuft bei dir Homegear? Wenn das Problem mit dem aktuellen Nightly noch besteht, poste tatsächlich mal das Log auf Loglevel 5.

Stell auch sicher, dass die Konfiguration in der rpcservers.conf korrekt ist. Für Port 2001 sieht meine Konfiguration so aus:

[RPCServer1]
# Interface to bind the RPC server to. By default IPv4 and IPv6 are
# enabled. If you want to only use IPv4 set "interface" to "0.0.0.0".
# Default: interface = ::
interface = ::

# The port number to bind the RPC server to. This setting is mandatory.
port = 2001

# Enable Homegear's XML-RPC and binary RPC server on this port.
# Default: true
xmlrpcServer = true

# Enable Homegear's JSON-RPC server on this port.
# Default: true
jsonrpcServer = true

# Enable Homegear's build-in web server on this port
# Default: false
webServer = true

# Path to static web content used by the web server
# Default: /var/lib/homegear/www
contentPath = /var/lib/homegear/www/rpc

# Default: contentPathPermissions = 550
# contentPathPermissions = 550

# Default: contentPathUser =
# contentPathUser = homegear

# Default: contentPathGroup =
# contentPathGroup = homegear

# Enable Homegear's build-in WebSocket server on this port
# WARNING: Enabling Websockets without authentication is a high security risk!
# So make sure, webSocketAuthType is not set to none!
# Default: false
webSocket = true

# Set ssl to "true" to enable SSL support
ssl = false

# You can specify the HTTP authentication type your XML RPC server
# uses here. Never ever use basic auth over an unencrypted connection!
# Can be one of the following: none, basic
# Default: authType = basic
authType = none

# You can specify the websocket authentication type here. Never ever use basic auth
# over an unencrypted connection!
# Can be one of the following: none, basic, session
# "session" checks for the PHP session variable "authorized", which must be set to
# "true" for the authentication to succeed.
# Default: webSocketAuthType = session
webSocketAuthType = session

Vor allem webSocketAuthType = session und jsonrpcServer = true sind wichtig.

Viele Grüße

Sathya

Hallo @sathya,

Okay, webSocketAuthType = session hat das Beispiel wieder zum Laufen gebracht. Das ist mir vermutlich beim Update von der 0.6.17 zur 0.6.19 durchgerutscht.
Allerdings ist das anfängliche Problem damit immer noch da. Ich habe mal den Aufruf getAllValues() um eine Peer Id erweitert. Peer 1 ist bei mir ein Rolladenaktor und der Log sieht in Chrome dann wie folgt aus (keine nicht-ASCII-Zeichen, alles prima):

Connecting (my id: HomegearApp-8ea5f326-9861-5863-f703-dc98e97b4a2e)...
homegear-ws-0.0.1.js:169 Client authenticated.
homegear-ws-0.0.1.js:128 Server authenticated.
homegear-ws-0.0.1.js:273 Subscribing to peers (2):
homegear-ws-0.0.1.js:274 []
homegear-ws-0.0.1.js:101 Ready.
homegear-ws-0.0.1.js:308 Invoking RPC method: {"jsonrpc":"2.0","method":"getAllValues","id":1,"params":[1]}
homegear-ws-0.0.1.js:176 Response to id 1 received: {"id":1,"jsonrpc":"2.0","result":[{"ADDRESS":"LEQ0767833","CHANNELS":[{"INDEX":0,"PARAMSET":{"CENTRAL_ADDRESS_SPOOFED":{"MAX":1,"MIN":0,"READABLE":true,"TYPE":"ENUM","UNIT":"","VALUE":0,"VALUE_LIST":["UNSET","CENTRAL_ADDRESS_SPOOFED"],"WRITEABLE":true},"CONFIG_PENDING":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":false},"DEVICE_IN_BOOTLOADER":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":false},"DUTYCYCLE":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":false},"RSSI_DEVICE":{"MAX":2147483647,"MIN":-2147483648,"READABLE":true,"TYPE":"INTEGER","UNIT":"","VALUE":-36,"WRITEABLE":false},"RSSI_PEER":{"MAX":2147483647,"MIN":-2147483648,"READABLE":true,"TYPE":"INTEGER","UNIT":"","VALUE":0,"WRITEABLE":false},"STICKY_UNREACH":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":true},"UNREACH":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":false},"UPDATE_PENDING":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":false}},"TYPE":"MAINTENANCE"},{"INDEX":1,"PARAMSET":{"DIRECTION":{"MAX":3,"MIN":0,"READABLE":true,"TYPE":"ENUM","UNIT":"","VALUE":0,"VALUE_LIST":["NONE","UP","DOWN","UNDEFINED"],"WRITEABLE":false},"INHIBIT":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":true},"LEVEL":{"MAX":1,"MIN":0,"READABLE":true,"TYPE":"FLOAT","UNIT":"100%","VALUE":0,"WRITEABLE":true},"WORKING":{"READABLE":true,"TYPE":"BOOL","UNIT":"","VALUE":false,"WRITEABLE":false}},"TYPE":"BLIND"}],"FAMILY":0,"ID":1,"NAME":"ROLLO_HAR","TYPE":"HM-LC-Bl1PBU-FM","TYPE_ID":106}

Mache ich das mir Peer ID 2 (HM-TC-IT-WM-W-EU) funktioniert es jedoch nicht;

Connecting (my id: HomegearApp-7cf3fdda-3384-0177-2bb6-6318a69b50e7)...
homegear-ws-0.0.1.js:169 Client authenticated.
homegear-ws-0.0.1.js:128 Server authenticated.
homegear-ws-0.0.1.js:273 Subscribing to peers (2):
homegear-ws-0.0.1.js:274 []
homegear-ws-0.0.1.js:101 Ready.
homegear-ws-0.0.1.js:308 Invoking RPC method: {"jsonrpc":"2.0","method":"getAllValues","id":1,"params":[2]}
VM1807:37 WebSocket connection to 'ws://192.168.2.124:2001/HomegearApp-7cf3fdda-3384-0177-2bb6-6318a69b50e7' failed: Could not decode a text frame as UTF-8.
WrappedWebSocket @ VM1807:37
WrappedWebSocket @ VM1830:37
HomegearWS.connectClient @ homegear-ws-0.0.1.js:163
HomegearWS.connect @ homegear-ws-0.0.1.js:68
(anonymous) @ index.php:62
j @ jquery.2.1.4.min.js:2
fireWith @ jquery.2.1.4.min.js:2
ready @ jquery.2.1.4.min.js:2
I @ jquery.2.1.4.min.js:2
homegear-ws-0.0.1.js:90 Error: undefined
homegear-ws-0.0.1.js:90 Error: Client disconnected.
homegear-ws-0.0.1.js:112 Event:
homegear-ws-0.0.1.js:113 Object {id: 504, jsonrpc: "2.0", method: "error", params: Array(3)}

Vom Timing sollte das in etwa gleich sein, also wohl eher nicht das verkürzte Timeout.
Anbei zwei Logs mit Loglevel 5. homegear-peerid2.log.txt mit dem Fehler und die andere mit funktionierendem Peer 1.

homegear-peerid2.log.txt (70,6 KB)
homegear-peerid1.log.txt (158,4 KB)

Hi @DasKleingedruckte,

so Problem ist gelöst. Danke dir ;-). Das Problem war, dass die Einheiten ANSI-kodiert waren, das ist nicht JSON-konform. Ich habe jetzt sämtliche Einheiten in UTF-8 umkodiert. Ist im nächsten Nightly und Stable.

Viele Grüße

Sathya

Prima, ich freue mich auf die nächste Version …