NEWS
[Frage] Verwendung von getForeignObjects (Adapter socketio)
-
Für ein Web Frontend muss ich auf die Funktion getForeignObjects zugreifen.
let promZones = new Promise((resolve, reject) => { servConn._socket.emit('getForeignObjects', 'milight-smart-light*', 'channel', function (err, _channels) { if (err) { reject(err) } resolve(_channels) }) }).then(...)
Das klappt nur wenn ich in der io-package.json des socketio-Adapters:
"allowAdmin": true
eintrage.
Das hat den Hintergrund, dass in lib/socket.js explizit für die Nutzung mehrere Funktionen allowAdmin===true erwartet wird.
if (that.settings.allowAdmin) { ... socket.on('getForeignObjects', function (pattern, type, callback) { ...} }
Zum Aufruf von z.B. getObjects ist alllowAdmin===true nicht erforderlich, von daher verstehe ich die Logik nicht so ganz.
Meine Frage: gibt es noch eine andere Möglichkeit getForeignObjects zu nutzen, ohne das ein Setzen von allowAdmin in der io-package.json erforderlich ist? Das wäre nämlich sehr unschön, da ein Nutzer des WFE erst händisch allowAdmin setzen müsste. Eigentlich ein NoGo. Jemand eine Idee was ich tun könnte?
Carsten
-
Hab die Frage noch mal hochgeholt, da ich immer noch keine Idee habe. Also liebe Mitentwickler wie macht oder würdet ihr es denn implementieren mit der Nutzung von getForeignObjects und der oben beschriebenen Problematik?
Carsten
-
Zum Aufruf von z.B. getObjects ist alllowAdmin===true nicht erforderlich, von daher verstehe ich die Logik nicht so ganz. ` getObjects greift nur auf die Objekte des Adapters zu, mit getForeignObjects wird auf Objekte von anderen Adaptern zu gegriffen. Das wiederum setzt entsprechende rechte voraus.
Ich seh hier aber gar keine Notwendigkeit getForeignObjects zu nutzen wenn getObjects funktioniert. Kannst du erklären warum du unbedingt foreign brauchst?
-
Genau das macht getObjects gerade nicht. Hier bekommst Du die Objekte von allen Adapterinstanzen wieder, ich benötige aber nur die Objekte von allen Instanzen meines Adapters und genau das geht mit getForeignObjects. Deswegen finde ich die Einschränkung über allowAdmin auch nicht wirklich stringent.
-
Ich hab beim durchschauen der lib/socket.js so das Gefühl da ist etwas durcheinander gekommen.
if (that.settings.allowAdmin)
Diese if abfrage taucht 2 mal auf. Dazu mach ich mal einen issue auf Github auf.
Das hilft dir aber nicht bei deinem eigentlichen Problem.
Wenn @Bluefox oder @Appollon77 da mal schauen würden wäre sicher nicht verkehrt, weil ich der Meinung bin das "getForeignObjects" und "getObjects" entweder beide nur dann mit "allowAdmin === true" verwendet werden können oder eben ohne.
-
Man kann auch getObjectView verwenden:
`servConn._socket.emit('getObjectView', 'system', 'state', {startkey: 'milight-smart-light.', endkey: 'milight-smart-light.\u9999'}, function (err, res) { if (!err && res) { var _res = {}; for (var i = 0; i < res.rows.length; i++) { _res[res.rows[i].id] = res.rows[i].value; } console.log(JSON.stringify(_res)); } else { console.log(JSON.stringify(err)); } });` [/i]
-
Besten Dank für den Hinweis Bluefox. Werde ich morgen direkt testen. Gibt es denn einen Grund warum getObjects und getForeignObjects unterschiedlich behandelt werden?
-
getForeignObjects ist wegen cloud/admin reingerutscht.
Ansonsten war noch keine Anforderung es zu machen.
-
Jetzt muss ich dann doch noch einmal nachfragen: wie setzt Du denn dann im cloud- / admin-Adapter allowAdmin auf true, um getForeignObjects zu nutzen? Gibt es da eine einfache Möglichkeit?
Ergänzung: habe gerade mit getObjectView getestet. Klappt alles so wie gedacht (ohne allowAdmin), perfekt! Wie das mit dem cloud-/admin-Adapter funktioniert würde mich trotzdem sehr interessieren. Bin auf github im Quellcode nicht richtig weiter gekommen.
Danke
Carsten
-
@bluefox sagte in [Frage] Verwendung von getForeignObjects (Adapter socketio):
servConn._socket.emit('getObjectView', 'system', 'state', {startkey: 'milight-smart-light.', endkey: 'milight-smart-light.\u9999'}, function (err, res) { if (!err && res) { var _res = {}; for (var i = 0; i < res.rows.length; i++) { _res[res.rows[i].id] = res.rows[i].value; } console.log(JSON.stringify(_res)); } else { console.log(JSON.stringify(err)); } }); ```` });
Hi,
habe das ganze auch gerade probiert, funktioniert auch so weit - außer, wenn ich versuche, die Enumerations damit zu bekommen. Also wenn ichmilight-smart-light
durchenum
ersetze, gibt es ein leeres result. Gibt es hier was besonderes? Wie komme ich an die Enumerations?
DankeEDIT: Hat sich erledigt! Habe inzwischen rausgefunden, dass man bei der Abfrage auch das
state
durchenum
ersetzen muss, dann gehts.