NEWS
Alle Räume aus enum.rooms auflisten
-
Hallo.
Ich hatte gedacht, es wäre ein leichtes, mir in Blockly alle Räume des "enum.rooms" in eine Liste zu packen und über eine Schleife auszugeben. Nach vielen Tests und nachlesen im Forum, funktioniert es immer noch nicht.
Ich wollte es über den Block "für jeden Wert "Raum" aus der Liste" lösen. Über "IDs vom Selektor" wollte ich dann den enum.rooms benutzen.
Kann mir jemand einen Tip geben, wie ich das machen kann? -
@proteus sagte in Alle Räume aus enum.rooms auflisten:
mir in Blockly alle Räume des "enum.rooms"
Die einzelnen Räume sind ja wieder Objekte unter
enum.rooms.*
. Daher habe ich gerade versucht, mit einem Selektor auf die ID genau diese Objekte zu holen (z.B.enum[id=enum.rooms.*]
).Aber das funktioniert leider nicht. Ich könnte mir vorstellen, dass der JavaScript-Adapter nicht alle Objekt-Typen zurückliefert, sondern nur
state
,channel
,device
, ... und nichtenum
.EDIT: Scheint wirklich so zu sein: https://github.com/ioBroker/ioBroker.javascript/blob/acc4af96c76334b159d3769e58084c8147d2b8c1/lib/sandbox.js#L688
-
Aber: Du kannst Dir eine JS-Funktion mit Rückgabe bauen, in der nix anderes steht als
return getEnums('rooms');
Dann bekommst Du alle Räume. Siehe
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getenums
-
@haus-automatisierung sagte: versucht, mit einem Selektor auf die ID genau diese Objekte zu holen
Der Selektor liefert nur Datenpunkte. Diese gibt es unter "enum" nicht.
-
Ihr seid ja schnell!
Mittlerweile habe ich es nun auch gelöst. Der Tip mit der JS-Funktion hat funktioniert:
var rooms = getEnums("rooms"); var result = []; rooms.forEach(function(r,i) { if(r.name.de){ //log(r.name.de); result.push(r.name.de); } ++i; }); return result;
Danke.
-
@proteus Sehr gut! Aber bissen umständlich, schau dir mal die
map
Funktion von Arrays anreturn getEnums('rooms').map(room => room.name.de);
Oder mit Deiner Prüfung ob Name ein Objekt ist:
return getEnums('rooms').map(room => typeof room.name === 'object' ? room.name.de : room.name);
-
@paul53 sagte in Alle Räume aus enum.rooms auflisten:
Der Selektor liefert nur Datenpunkte. Diese gibt es unter "enum" nicht.
Ich hatte irgendwie gehofft, dass man damit alle möglichen Objekt-IDs selektieren kann.
Aber gut, kommt ein neuer Blockly-Block für
getEnums
eben auf meine ToDo-Liste -
@haus-automatisierung
Eine Sache ist mir noch aufgefallen:
getEnums('rooms') liefert unterschiedliche Ergebnisse.Das war auch schon mal Thema in einem anderen Beitrag: https://forum.iobroker.net/topic/41999/inkonsistenzen-mit-getenums-rooms
Ich habe mir jetzt so beholfen:
var rooms = getEnums("rooms"); var result = []; rooms.forEach(function(r) { let room = r.name; if(typeof room == 'object') room = room.de; result.push(room); }); return result;
Das ist zwar immer noch nicht schön, geht jetzt aber sicher.
-
@proteus sagte in Alle Räume aus enum.rooms auflisten:
Eine Sache ist mir noch aufgefallen:
Exakt das habe ich doch oben im zweiten Statement geprüft
Name ist entweder ein String oder ein Objekt mit mehreren Eigenschaften (für jede Sprache ein String).
Das ist übrigens überall im ioBroker so, nicht nur bei Enums. Bei meinen Adaptern habe ich mir die Arbeit gemacht und den Namen jedes einzelnen Objektes übersetzt.