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? -
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
-
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?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
-
@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
@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.
-
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?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.
-
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
mapFunktion von Arrays an :)return 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); -
@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.
@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
getEnumseben auf meine ToDo-Liste :) -
@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
getEnumseben 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.
-
@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.
-
Hello all,
ich brauchte eine Funktion um den Raum Namen das aktuellen Objektes zu erhalten.
Früher ging das überlet room = getObject(ObjectID, 'rooms').enumNames[0]; // OLD-DEPRECATEDseit dem letzten Javascript Update bekomme ich hier nur noch undefined.
ich habe mir nun für die function im script so beholfen:const rooms = getEnums('rooms'); let lang = 'de'; for (const room of rooms) { if (!Array.isArray(room.members)) continue; if (room.members.includes(ObjectID)) { // Name kann String oder Sprachobjekt sein if (typeof room.name === 'string') { return room.name; } //wichtigster Fall if (room.name && room.name[lang]) { return room.name[lang]; } // Fallback: irgendeine Sprache if (room.name && typeof room.name === 'object') { return Object.values(room.name)[0]; } } } return null; // kein Raum gefundenohne Sonderfälle:
const rooms = getEnums('rooms'); let lang = 'de'; for (const room of rooms) { if (room.members.includes(ObjectID)) return room.name[lang]; }ausser die Sonderfälle: Habt ihr eine einfachere Lösung als jedes mal das roomsEnums durch zu iterieren? Das ändert sich in der Regel zwar ja selten, daher itereriere ich das nur beim startup des scripts in eine Liste
-
Hello all,
ich brauchte eine Funktion um den Raum Namen das aktuellen Objektes zu erhalten.
Früher ging das überlet room = getObject(ObjectID, 'rooms').enumNames[0]; // OLD-DEPRECATEDseit dem letzten Javascript Update bekomme ich hier nur noch undefined.
ich habe mir nun für die function im script so beholfen:const rooms = getEnums('rooms'); let lang = 'de'; for (const room of rooms) { if (!Array.isArray(room.members)) continue; if (room.members.includes(ObjectID)) { // Name kann String oder Sprachobjekt sein if (typeof room.name === 'string') { return room.name; } //wichtigster Fall if (room.name && room.name[lang]) { return room.name[lang]; } // Fallback: irgendeine Sprache if (room.name && typeof room.name === 'object') { return Object.values(room.name)[0]; } } } return null; // kein Raum gefundenohne Sonderfälle:
const rooms = getEnums('rooms'); let lang = 'de'; for (const room of rooms) { if (room.members.includes(ObjectID)) return room.name[lang]; }ausser die Sonderfälle: Habt ihr eine einfachere Lösung als jedes mal das roomsEnums durch zu iterieren? Das ändert sich in der Regel zwar ja selten, daher itereriere ich das nur beim startup des scripts in eine Liste
@madjack84 sagte: seit dem letzten Javascript Update bekomme ich hier nur noch undefined.
Welche Version des JS-Adapters? In Version 9.0.11 funktioniert es noch.

Der Raumname von "enum.rooms.living_room" ist mehrsprachig.
-
@madjack84 sagte: seit dem letzten Javascript Update bekomme ich hier nur noch undefined.
Welche Version des JS-Adapters? In Version 9.0.11 funktioniert es noch.

Der Raumname von "enum.rooms.living_room" ist mehrsprachig.
@paul53 : Ich hab auch 9.0.11 installiert und meine Scripte die jahrelang funktioniert haben, spuckten nur noch undefinded aus, sodass die Rolläden in den Zimmern wilde Fahrten machten.
Hab nun ein Script testweise wieder zurück gebaut und kann den "undefined" Fall tatsächlich nicht mehr nachstellen. Die ObjectIDs sind unverändert.
Hab auch keine wilden Updates seit gestern gemacht und auch javascript nicht neu gestartet.
Puhh, da fehlt mir jetzt die Idee woher das kam :/