NEWS
Adapter Socket.IO Benötige Hilfe zum Updateverhalten
-
Hallo Zusammen,
ich versuche mich gerade in den Adapter Socket.io einzuarbeiten. Soweit läuft er und sendet Updates. Im file conn.js habe ich die Stelle ausgemacht, an welcher eine Wildcard definiert ist, dass von allen Objekten ein Update übertragen wird. Da dies eine Flut an Daten bedeutet, versuche ich gerade die Datenmenge über eine Auswahl zu reduzieren. Ich komme diesbezüglich nicht weiter. Versucht habe ich ein Beispiel aus dem Forum (funktioniert leider nicht):let myState = 'hm-rpc.0.NEQ1684242.1.STATE'; servConn._socket.emit('subscribe', myState);
Gibt es eine Möglichkeit, das Update auf selektierte Adapter zu reduzieren? Z.B. hue.0., hue.1. usw.? Aus den Adapter Updates meine ich herausgelesen zu haben, dass dafür eine Array Lösung gesetzt wurde. Wenn ja würde ich mich über Hilfe freuen. Wie muss ich dies in dem auf GitHub als Beispiel hinterlegten Code einfügen? Das müsste doch aus der index.html heraus gehen...
Vielen Dank!
Grüße
Michael -
@mischu sagte in Adapter Socket.IO Benötige Hilfe zum Updateverhalten:
Ich komme diesbezüglich nicht weiter. Versucht habe ich ein Beispiel aus dem Forum (funktioniert leider nicht):
let myState = 'hm-rpc.0.NEQ1684242.1.STATE'; servConn._socket.emit('subscribe', myState);
Du solltest niemals auf etwas zugreifen, das mit
_
beginnt. Das sind internals.Gibt es eine Möglichkeit, das Update auf selektierte Adapter zu reduzieren? Z.B. hue.0., hue.1. usw.? Aus den Adapter Updates meine ich herausgelesen zu haben, dass dafür eine Array Lösung gesetzt wurde. Wenn ja würde ich mich über Hilfe freuen. Wie muss ich dies in dem auf GitHub als Beispiel hinterlegten Code einfügen? Das müsste doch aus der index.html heraus gehen...
Wenn du nicht alle Updates bekommen willst, musst du im
init()
den Wert vonautoSubscribe
auffalse
setzen.
Siehe hier: https://github.com/ioBroker/ioBroker.socketio/blob/919a467121e673590377a4fd1023f99ee38656b5/example/conn.js#L180Danach kannst du die Methode
subscribe()
verwenden. Die Akzeptiert State Namen, Arrays und Wildcards. Also z.B.servConn.subscribe('hue.*')
.Und stelle sicher, dass du Port 8084 verwendest, siehe auch hier: https://forum.iobroker.net/topic/41118/socket-io-eigene-visualisierung
-
@unclesam said in Adapter Socket.IO Benötige Hilfe zum Updateverhalten:
autoSubscribe
Danke für die schnelle Antwort!
Um im conn.js autoSubscribe auf false zu stellen habe ich folgendes gemacht:
init: function (connOptions, connCallbacks, objectsRequired, autoSubscribe) { autoSubscribe = false;
Die Updates haben gestoppt.
In der index.html habe ich folgendes eingefügt:
servConn.namespace = 'myapp'; servConn.subscribe('hue.*'); servConn._useStorage = false; var states = []; servConn.init({ name: 'myapp', // optional - default 'vis.0' connLink: 'http://localhost:8084', // optional URL of the socket.io adapter socketSession: '', // optional - used by authentication
Leider bekomme ich keine updates...
-
@mischu sagte in Adapter Socket.IO Benötige Hilfe zum Updateverhalten:
@unclesam said in Adapter Socket.IO Benötige Hilfe zum Updateverhalten:
autoSubscribe
Danke für die schnelle Antwort!
Um im conn.js autoSubscribe auf false zu stellen habe ich folgendes gemacht:
init: function (connOptions, connCallbacks, objectsRequired, autoSubscribe) { autoSubscribe = false;
Moment, was? Nein, du sollst beim Aufruf von init() den vierten Parameter auf false setzen, nicht das conn.js ändern. Bitte daran nie etwas ändern, weil du dann weder Updates machen kannst noch dir irgendjemand helfen kann (da wir meistens den offiziellen Source anschauen).
In der index.html habe ich folgendes eingefügt:
servConn.namespace = 'myapp'; servConn.subscribe('hue.*'); servConn._useStorage = false; var states = []; servConn.init({ name: 'myapp', // optional - default 'vis.0' connLink: 'http://localhost:8084', // optional URL of the socket.io adapter socketSession: '', // optional - used by authentication
Leider bekomme ich keine updates...
Ich habe nicht gerne angebissene Sachen... kannst du bitte das ganze init() posten? Am besten gleich den ganzen JS Code aus deiner HTML Datei.
Und ich würde nichts machen, bevor du das init() aufgerufen hast.
Die Verbindung zum Server funktioniert (in den Developer Tools nachschauen - F12)? Der socket.io Adapter läuft?
-
Hier der HTML code. Ich stehe gerade komplett auf dem Schlauch... was muss ich eintragen, dass ich spezifische Updates bekomme und diese im console.log angezeigt werden? ioBroker läuft und Verbindung zum Server wird aufgebaut. Das ist bis auf meine Ergänzung
servConn.subscribe('hue.*');
der aktuelle Beispielcode von GitHub. Mehr habe ich noch nicht aufgebaut, da ich erst das Autoupdate zum laufen bekommen möchte.
servConn.namespace = 'myapp'; servConn.subscribe('hue.*'); servConn._useStorage = false; var states = []; servConn.init({ name: 'myapp', // optional - default 'vis.0' connLink: 'http://192.168.178.43:8084', // optional URL of the socket.io adapter socketSession: '', // optional - used by authentication }, { onConnChange: function (isConnected) { if (isConnected) { console.log('connected'); servConn.getStates(function (err, _states) { var count = 0; for (var id in _states) { count++; } console.log('Received ' + count + ' states.'); states = _states; }); } else { console.log('disconnected'); } }, onRefresh: function () { window.location.reload(); }, onUpdate: function (id, state) { setTimeout(function () { console.log('NEW VALUE of ' + id + ': ' + JSON.stringify(state)); states[id] = state; }, 0); }, onError: function (err) { window.alert(_('Cannot execute %s for %s, because of insufficient permissions', err.command, err.arg), _('Insufficient permissions'), 'alert', 600); } });
-
@mischu Also, die ersten zwei Argumente von init() hast du ja schon: die Config und die Callbacks, das dritte ist, ob du Objektänderungen willst, das kannst du auf
false
setzen und das vierte eben auch auffalse
.Damit sieht dann dein init() etwa so aus (Optionen und Callbacks habe ich rausgekürzt):
servConn.init({ // options }, { // callbacks }, false, false);
Und nun würde ich das
subscribe()
eben erst nach dem Aufruf von init() machen. Also ganz zuunterst im Script.Wenn jetzt etwas nicht geht, wäre das Konsolen-Log interessant. Welche Meldungen kommen? Wo gibt es vielleicht noch Fehlermeldungen?
-
@unclesam
Nochmals Dankeschön für Deinen Einsatz! Ok, wenn ich das false bei autoSubscribe weglasse rennen Updates.Mit dem false bei autoSubscribe ist Stille. Hier die logs:
ioBroker:
socketio.0 2021-01-20 16:19:13.301 info (5112) ==>Connected system.user.admin from ::ffff:192.168.178.20console chrome:
conn.js:150 Trying connect...
16:19:11.965 conn.js:296 2021-01-20T15:19:11.965Z Connected => authenticate
16:19:12.037 conn.js:317 2021-01-20T15:19:12.037Z Authenticated: true
16:19:12.044 socketTest.js:14 connected
16:19:13.804 socketTest.js:20 Received 10926 states.Also er verbindet, lädt die States aber es findet kein traffic beim update statt. Somit gehe ich davon aus, dass ein Problem im Bereich der Definition des gewünschten Updates herrscht. Also bei:
servConn.subscribe('hue.*')
Ich habe dies wie empfohlen ganz am Ende platziert.