NEWS
socket.io (eigene Visualisierung)
-
@d-ve sagte in socket.io (eigene Visualisierung):
@unclesam said in socket.io (eigene Visualisierung):
Objekte enthalten die (Meta-) Informationen während Datenpunkte den eigentlichen Wert enthalten
Okay, vielen Dank. Das hilft enorm beim Verständnis von ioBroker
Steht übrigens auch hier: https://github.com/ioBroker/ioBroker.socketio#brief-description-of-concept
@unclesam said in socket.io (eigene Visualisierung):
Wir sind dankbar für alle PRs mit Dokumentation
PR??
Wer ist "wir"?
Kann da gerne mal ein Youtube-Video zu machen, wenn ich da hinter gestiegen bin...PR: Pull Request auf GitHub.
wir: alle Entwickler, sowohl von Adaptern wie auch von Core-Komponenten wie socket.io.Grundsätzlich würde ich aber empfehlen, (auch) mit subscribe() zu arbeiten
Wo ist das dokumentiert?
Tja, die Dokumentation... Hier ist der Code: https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/conn.js#L513-L519
Aber, dann musst du das
autoSubscribe
iminit()
auffalse
setzen.Für Updates reicht das ja... Aber ich möchte zum Beispiel in meinem Script einen eigenen Objektbaum erstellen. Dazu muss ich einmalig die kompletten Devices mit allen properties einlesen, um z.B. zu wissen, ob es sich um eine Lampe oder um eine Steckdose handelt. Das brauche ich ja nur einmalig und muss da nix subscriben.
Ja, dann brauchst du eigentlich den gesamten Objektbaum. Den kannst du dir holen, indem du
objectsRequired
iminit()
auftrue
setzt: https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/conn.js#L180
Oder irgendwann getObjects() aufrufst.Sei dir einfach bewusst, dass das riesige Datenmengen sein können. Ich habe bei mir mehrere tausend Objekte!
-
weiß nicht, ob ich kapiert habe, was du suchst
ich nutze in einem meiner html tabellen einen button als schalter. im html file wird ein script integriert, welche dann in der vis funktioniert - vielleicht sucht du sowas- diese const wird am ende des erzeugten html codes angehängt:
const buttonScript = '<script> function setOnDblClickCustom( myvalue ) { var Self = this; var objID = myvalue; Self.servConn.getStates(objID, (error, states) => { console.log(states); Self.servConn.setState(objID, !states[objID].val); }); } </script>'
-
@unclesam said in socket.io (eigene Visualisierung):
Pull Request auf GitHub
Git ist für mich noch ein rotes Tuch, wo mir die Zeit fehlt, mich reinzuarbeiten (hab relativ wenig Nutzen davon). Könnte mir aber vorstellen, das Example mal etwas aufzubohren...
@unclesam said in socket.io (eigene Visualisierung):
Ja, dann brauchst du eigentlich den gesamten Objektbaum.
...aber nur von den Datenpunkten, die ich brauche. Sosnt sind das auch viel zu viele (komme mit 1000 nicht hin, hab ja schon weit über 100 Shellys).
@unclesam said in socket.io (eigene Visualisierung):
Den kannst du dir holen, indem du objectsRequired im init() auf true setzt
Wo landen die denn dann?Bin jetzt mit dem Debugger durch:
Er steigt hier in _queueCmdIfRequired() aus (da kommt true zurück) :
https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/conn.js#L1259Werde ich aber gerade nicht schlau raus.
Spontan sieht es so aus, als ob er den Befehl in eine Queue schreibt, diese aber nicht ausführt...
-
@d-ve sagte in socket.io (eigene Visualisierung):
Git ist für mich noch ein rotes Tuch, wo mir die Zeit fehlt, mich reinzuarbeiten (hab relativ wenig Nutzen davon). Könnte mir aber vorstellen, das Example mal etwas aufzubohren...
Der Vorteil von GitHub: du musst gar nichts mit Git machen, du kannst einfach die Dateien anpassen und daraus einen PR erstellen. Alles im Browser. Lohnt sich, das mal anzuschauen.
Wo landen die denn dann?
Da lag ich etwas falsch, es ist eine Object Subscription, du erhälst einfach Objekt-Veränderungen. Du kannst dich darauf mit dem
onObjectChange
Callback registrieren.Bin jetzt mit dem Debugger durch:
Er steigt hier in _queueCmdIfRequired() aus (da kommt true zurück) :Was sagen die lokalen Variablen, wenn du in der Funktion bist? Insbesondere
this._authRunning
undthis._isAuthDone
.Allgemeine Frage: musst du dich authentifizieren? Hast du einen ioBroker Benutzer mit Passwort?
-
@unclesam said in socket.io (eigene Visualisierung):
Da lag ich etwas falsch, es ist eine Object Subscription, du erhälst einfach Objekt-Veränderungen
Wie werden die getriggert? Bei onUpdate() werden ja alle Änderungen reingespült.
@unclesam said in socket.io (eigene Visualisierung):
Was sagen die lokalen Variablen, wenn du in der Funktion bist? Insbesondere this._authRunning und this._isAuthDone.
beide false
@unclesam said in socket.io (eigene Visualisierung):
Allgemeine Frage: musst du dich authentifizieren? Hast du einen ioBroker Benutzer mit Passwort?
Nein, noch nicht... -
@d-ve sagte in socket.io (eigene Visualisierung):
Wie werden die getriggert? Bei onUpdate() werden ja alle Änderungen reingespült.
Bei Änderungen am Objekt (nicht am State). Das ist eine eher seltene Angelegenheit.
beide false
Wenn du den Breakpoint hier setzt: https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/conn.js#L1270
- wird der angesprungen?
- was ist der Inhalt von
version
?
Nein, noch nicht...
OK, dann ist das mal kein Problem.
-
@unclesam said in socket.io (eigene Visualisierung):
wird der angesprungen?
yep
@unclesam said in socket.io (eigene Visualisierung):
was ist der Inhalt von version?
4.1.11
-
@d-ve Dann ist das ja gut. Und ich nehme an, es wird auch nur einmal angesprungen. Danach ist die Verbindung da und alles ist gut. Kannst du mal den Vorschlag von @OliverIO versuchen und/oder schauen, was in Chrome / Edge (oder FF???) in den Entwickler-Tools unter "Netzwerk" steht. Es gibt dort eine langlebige Verbindung (unter "Time" steht bei mir "Pending") (1), dort kannst du drauf klicken und auf den Reiter "Messages" wechseln (2); da solltest du alle ausgetauschten Nachrichten sehen (3):
Was steht da bei dir?
-
@unclesam said in socket.io (eigene Visualisierung):
da solltest du alle ausgetauschten Nachrichten sehen
Ab da kommen nur noch stateChange Nachrichten
Hab auch nochmal geschaut, die Queue wird wohl irgendwo geleert:
Hat das was zu bedeuten?
Trying to get states again, because emitted getStates still pending
-
@d-ve Ja, es scheint, dass getStates hängt. Du hast gesagt dass du tausende States hast. Vielleicht solltest du wirklich nur die States holen, die du brauchst.
-
@unclesam said in socket.io (eigene Visualisierung):
@d-ve Ja, es scheint, dass getStates hängt. Du hast gesagt dass du tausende States hast. Vielleicht solltest du wirklich nur die States holen, die du brauchst.
das ist ja genau das, was ich hier von Anfang an versuche... Weiß nur nicht wie...
-
@d-ve sagte in socket.io (eigene Visualisierung):
das ist ja genau das, was ich hier von Anfang an versuche... Weiß nur nicht wie...
Sorry, jetzt haben wir uns wirklich genau einmal in Kreis gedreht. Naja, immerhin habe ich eine Information mehr: es gibt einen Request für
["getStates", "*"]
. Im Code von conn.js finde ich dazu nichts. Machst du das in deinem Code?Im Beispiel-Code wir das hier gemacht: https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/index.html#L27
Bei dir würde ich aber wie gesagt nicht empfehlen, alle States zu holen.
Wenn du nicht weisst, woher der Request kommt, dann setze mal hier einen Breakpoint:
https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/conn.js#L775
und schau dir dann den Callstack an. -
@unclesam said in socket.io (eigene Visualisierung):
Im Beispiel-Code wir das hier gemacht: https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/index.html#L27
I know... das hat nur nicht funktioniert... Deswegen habe ich den Request jetzt schon dreihundertiverundachtzigmal umgeschrieben
@unclesam said in socket.io (eigene Visualisierung):
Bei dir würde ich aber wie gesagt nicht empfehlen, alle States zu holen.
Wie gesagt, habe ich auch nicht vor... Ich möchte momentan einfach nur mal IRGENDEINEN State holen, am liebsten ein spezifisches Device.
Momentan funktioniert bei mir nur der onUpdate()-Teil. Aber wenn ich den Status meiner Lampe anzeigen will, kann nicht so lange warten bis die sich mal bequemt, zufällig ein Update zu senden.lg, Dave
-
@d-ve Jedes Mal, wenn ich deinen Screenshot anschaue, fällt mir wieder etwas auf...
Auf welchen Port verbindest du dich mit dem socket.io Server? Machst du das etwa mit Port 8081? Gleich nach deinem "getStates()" reklamiert nämlich der Admin, dass mit dem Request etwas nicht stimmt. Richtig wäre der Port des socket.io Adapters (normalerweise 8082).
-
@unclesam sagte in socket.io (eigene Visualisierung):
Richtig wäre der Port des socket.io Adapters (normalerweise 8082).
8084!
-
@unclesam said in socket.io (eigene Visualisierung):
Auf welchen Port verbindest du dich mit dem socket.io Server? Machst du das etwa mit Port 8081?
Ja nehme 8081. 8084 aus dem Beispiel hat garnicht funktioniert...
@unclesam said in socket.io (eigene Visualisierung):
der Port des socket.io Adapters (normalerweise 8082).
Hmmm... das könnte die Ursache sein, wobei sich mir dann die Frage stellt, warum der Adapter unter 8081 dann überhaupt antwortet. Kann das nachher mal mit 8082 testen (bin gerade nicht am Platz).
lg, Dave
-
-
@d-ve sagte in socket.io (eigene Visualisierung):
wobei sich mir dann die Frage stellt, warum der Adapter unter 8081 dann überhaupt antwortet
Ganz einfach: das ist der Port von Admin. Und Admin verwendet auch socket.io, aber teilweise andere Befehle (da Admin mehr können muss als Socket.io).
Und: den socket.io Adapter hast du schon installiert, oder?
-
@homoran sagte in socket.io (eigene Visualisierung):
8082 ist der port für den Web-Adapter, 8081 für den admin, socket.io hat üblicherweise 8084, könnte aber bei dir umkonfiguriert sein.
Richtig, hatte ich verwechselt. Aber gibt es einen Grund, nicht einfach die socket.io Verbindung vom Web-Adapter zu verwenden? Die sollte ja identisch sein mit dem anderen socket.io, oder auch nicht? Ich verwende für meine selbstgeschriebene Vis einfach Port 8082 und habe den socket.io gar nicht installiert. Aber ich verwende auch nicht conn.js sondern habe da selber Code geschrieben (da es eine Angular App ist).
-
@unclesam sagte in socket.io (eigene Visualisierung):
die socket.io Verbindung vom Web-Adapter zu verwenden? Die sollte ja identisch sein mit dem anderen socket.io, oder auch nicht?
Da habe ich ehrlich keine Ahnung, habe nur festgestellt, dass es Problem mit dem Web-Adapter gab, die dadurch zu lösen waren nicht den internen socket zu nehmen.