NEWS
Nodered Problem mit Websocket
-
@speedyblade Ich habe keine Ahnung was ihr macht - unabhängig vom Websocket - müsstet ihr ja immer mit http-in & out eine Verbindung bekommt. Ihr müsst höchstens schauen, ob noch was auf dem port läuft oder ihr sonst irgendeine Netzverbindung zugemacht habt.
Die Seite wird jedenfalls mit diesen Nodes so angezeigt, wenn das System ordnungsgemäß arbeitet.
Das Anzeigen der Seite hat noch nicht mal was mit Websockets zu tun. Selbst wenn Du keine Webseite aufbaust, sollte der Browser zumindest das anzeigen:
und dabei wurde nur als URL bei der Http-In Node /leer angegeben
so und wenn das schon nicht funktioniert, dann ist an Deinem Netz oder an Deiner Maschine auf der NodeRed läuft was faul.
Falls dieser Fehler im Log auftaucht:
"Fehler beim Senden: Error: WebSocket is not open: readyState 3 (CLOSED)"
das hat wahrscheinlich gar nichts mit dem Browseraufruf zu tun.
Das kommt, wenn Du den NodeRed Editor zu machst und der Adapter noch was prüft - ist mit der neuen Version behoben - habe ich aber auch gehabt und ist unbedenklich. Wenn Du NodeRed im Editor längere Zeit nichts machst kommt der Fehler auch nicht. Wenn Du innerhalb vom iobroker das Editorfenster aufmachst und dann wechselt - passiert so was häufiger. Das hat aber alles nichts damit zu tun, dass Du den Webserver nicht erreichst. -
also ich hab keinen Plan warum das nicht läuft.
was hast du bei den Nodes alles geändert?
Benötigt es zum Anzeigen der Webseite noch einen Adapter? -
@speedyblade nicht ws/simple nur /simple und auch kein ws und so ein Mist.
Ganz normal:
http://ip-adresse:1880/simple
Bei den ws - Nodes wird keine IP Adresse angegeben, sondern die stellt man auf lauschen und listen:
Der eigenliche Verbindungsaufbau zu den ws Nodes - erfolgt in dem script Teil der HTML Seite in der Template Node.
Anhand Deines Aufrufs der normalen HTTP Seite - setzt das Script die URL zusammen, um mit Deinen ws-Nodes zu kommunizieren:
wsUri += "//" + loc.host + loc.pathname.replace("simple","ws/simple"); function wsConnect() { console.log("connect",wsUri); ws = new WebSocket(wsUri); //var line = ""; // either uncomment this for a building list of messages ws.onmessage = function(msg) { var line = ""; // or uncomment this to overwrite the existing message // parse the incoming message as a JSON object var data = msg.data; // console.log(data); // build the output from the topic and payload parts of the object line += "<p>"+data+"</p>"; // replace the messages div with the new "line" document.getElementById('messages').innerHTML = line; //ws.send(JSON.stringify({data:data})); } ws.onopen = function() { // update the status div with the connection status document.getElementById('status').innerHTML = "connected"; //ws.send("Open for data"); console.log("connected"); } ws.onclose = function() { // update the status div with the connection status document.getElementById('status').innerHTML = "not connected"; // in case of lost connection tries to reconnect every 3 secs setTimeout(wsConnect,3000); } }
also die ws.uri.
Das was mit console.log ausgegeben wird erkennst Du in der console Deines Browsers ( mit F12)
-
Fehler besteht weiterhin
Die Ip Adresse ist schon jede vom ioBroker, richtig?
Alles andere würde für mich keinen Sinn machen.selbst dieses einfache Beispiel funktioniert ja nicht mal
-
@speedyblade Na das ist ja was ich meine. Wenn diese einfache Beispiel nicht funktioniert - dann ist da der Wurm drin.
Zeig doch mal wie Du den Node-Red Editor aufrufst. Gibst Du auch brav http://192.168.0.118:1880/simple ein und nicht nur die IP-Adresse?
-
-
@speedyblade Und wie schaut dann die URL aus, wenn Du es aufgerufen hast? - Also im Browser.
Und wie gesagt das http:// am Anfang nicht weglassen.Hast Du irgendwas an Deiner settings.js gefummelt oder meldest Du Dich mir Namen und Passwort im Node-Red an?
-
nein..nichts herumgefummelt...habe sogar extra neu aufgesetzt...auch ohne Erfolg
und ja...Name und Passwort hatte ich zuerst, aber aktuell fahre ich ohne Zugangsdaten, dennoch wird die Page nicht aufgerufen
auch bereits neu installiert, fixer drüber gelaufen, alle browser durch probiert..hat alles nichts gebracht.
kann es sein, dass der Port 1880 eventuell anderweitig genutzt wird? -
@speedyblade Klar kann das sein - deswegen wollte ich ja wissen, was im Browser steht wenn Du normal node-red aufrufst. Da siehst ja welche IP Adresse und welchen port Du benutzt.
-
http://192.168.0.118:1885/simple
na klar...der Port von NodeRed muss verwendet werden
Jetzt ist auch der WS verbunden
-
@speedyblade Na also
-
@mickym
jetzt kann ich zu meinem ursprünglichem Problem zurück
Es läuft ein Gira HS der Endpoints sendet.
Die WS Verbindung zum HS steht, einfache E/A Befehle können auch von NR zum HS gesendet werden.
Umgekehrt jedoch noch nicht.
Muss das in NR abonniert werden, oder wie checkt NR, wann der HS Daten sendet? -
Wenn ein WS Verbindung steht - steht diese in beide Richtungen und dann hört die ws- IN Node mit dem Lauschen ob was ankommt.
Auf der Beispielseite siehst Du ja dass im Debug Fenster was ankommt, wenn du den Button Click to send message ankommt.
mit
function doit(m) { if (ws) { ws.send(m); }
ws.send - schickt also der Server auf der anderen seite seine Nachricht.
Da kann aber NodeRed nichts machen - wenn eine ws Verbindung steht muss natürlich immer derjenige, der was senden will initiativ werden. Also musst Du wohl oder übel auf der HS Seite schauen, warum der nichts sendet.
-
https://192.168.0.11/endpoints/call?key=CO@TEST_EIN_AUS&method=toggle&value=1&user=XXX&pw=YYY
gibt man den Befehl im Browser ein, wird das Objekt getogglet im HS.
Ergebnis
{"request": {"method": "toggle", "key": "CO@TEST_EIN_AUS"}, "code": 0, "type": "call"}
Json-Format
{ "request":{ "method":"toggle", "key":"CO@TEST_EIN_AUS" }, "code":0, "type":"call" }
-
@speedyblade Das ist aber keine Websocket Verbindung - und dazu braucht man das auch nicht. Das ist eine normale HTTP-Get Kommunikation. Dafür brauchst Du wie gesagt die websocket Nodes nicht.. Wenn Du im HS entsprechende URLs zu bestimmten Aktien festlegen kannst, ist das somit kein Problem.
-
hier ein Beispiel, wie Daten von NR an den HS via WS gesendet werden.
Wenn das kein WS ist, dann kenne ich mich nicht mehr aus
-
@speedyblade Das hat doch mit WS nichts zu tun.
Das ist eine Template Node - die Du zwischen einen HTTP-IN und HTTP-Out Node klemmen kannst.
Das bekommst auch so hin, indem Du in die payload einfach ein JS Objekt packst und zwischen ein HTTP-In und Out Node packst:
-
@mickym
hilft mir leider auch nicht weiterselbst wenn ich direkt am WS Out v. HS einen msg.payload setze und über den HS den Befehl sende, kommt da nix an.
-
@speedyblade Nochmal Du brauchst kein Websocket. Wenn Du über eine URL am HS absetzt nimm einfach eine normale HTTP In node - Wie unten mit dem /leer gezeigt.
-
@mickym Wenn Du JSONs aus dem Homeserver verschicken willst dann nimmst besser die POST Methode.