NEWS
Socket.io > Subscribe
-
Hallo,
ich versuche mich gerade an socket.io - eher erfolglosWie kann ich konkret nur einen Datenpunkt.State subscriben und das "_autoSubscribe" für alle anderen loswerden (womit der Browser in 1 Minute so viele DPs aktualisiert, dass er abstürzt).
Hier das Minimalbeispiel:
<!DOCTYPE html> <html lang="de"> <head> <link rel="icon" href="data:,"> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <script src="http://IP:8082/socket.io/socket.io.js"></script> <script src="conn.js"></script> </head> <body> <br> Wasserzählerstatus: <b id="wasserzaehlerStatus">unbekannt</b><br> Stromverbrauch aktuell: <b id="stromvAktuell">unbekannt</b><br> </body> <script> servConn.namespace = 'mobile.0'; servConn._useStorage = false; var states = []; servConn.init({ name: 'mobile.0', // optional - default 'vis.0' connLink: 'http://IP:8082', // 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++; } states = _states; servConn.getStates("mqtt.0.wasserzaehler.status", (error, states) => { document.getElementById("wasserzaehlerStatus").innerHTML = states["mqtt.0.wasserzaehler.status"].val + "."; }); servConn.getStates("hm-rpc.1.MEQ0123456.1.POWER", (error, states) => { document.getElementById("stromvAktuell").innerHTML = states["hm-rpc.1.MEQ0123456.1.POWER"].val + " W/h"; }); }); } 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; servConn.getStates("mqtt.0.wasserzaehler.status", (error, states) => { document.getElementById("wasserzaehlerStatus").innerHTML = states["mqtt.0.wasserzaehler.status"].val + "."; }); servConn.getStates("hm-rpc.1.MEQ0123456.1.POWER", (error, states) => { document.getElementById("stromvAktuell").innerHTML = states["hm-rpc.1.MEQ0123456.1.POWER"].val + " W/h"; }); }, 0); }, onError: function (err) { window.alert(_('Cannot execute %s for %s, because of insufficient permissions', err.command, err.arg), _('Insufficient permissions'), 'alert', 600); } }); </script> </html>
Grüße
Kai -
OK, geschafft
servConn.init({ .... }, false, false); // autoSubscribe deaktiviert
Und so konnte ich meine Teststates subscriben:
let wasserzaehler = 'mqtt.0.wasserzaehler.status'; let stromv = 'hm-rpc.1.MEQ0123456.1.POWER'; servConn._socket.emit('subscribe', wasserzaehler); servConn._socket.emit('subscribe', stromv);
Oder mehrere Subscriptions als Array:
let wasserzaehler = 'mqtt.0.wasserzaehler.status'; let stromv = 'hm-rpc.1.MEQ0123456.1.POWER'; let subscriptions = [wasserzaehler, stromv]; servConn._socket.emit('subscribe', subscriptions);
Da ich leider keinen thread hier im Forum gefunden habe, der am Ende ein (vollständiges) Minimalbeispiel aufzeigt, sollte dieser Post als gutes Beispiel für einen Start dienen (und nicht mir als Alleinunterhalter)