NEWS
Raumname ermitteln
-
Ich versuche mich gerade am Javascript Adapter und habe gerade folgendes Problem:
Über````
var selectorActTemp = $('channel[state.id=*.ACTUAL_TEMPERATURE]');Name und Wert des Kanals hole ich über```` selectorActTemp.each(function (id, i) { var status = getState(id).val; var obj = getObject(id); log("Kanalname: " + obj.common.name + ": " + status); }); ````Aber wie kann ich den Raumnamen ermitteln, der zu diesem Kanal gehört? -
Hat leider nicht funktioniert. Ich behelfe mir jetzt mit dieser (leider nicht sonderlich eleganten) Lösung:```
`function getRoomByChannelId(chId) {
var rooms = getEnums('rooms');
var chName = chId.replace(".ACTUAL_TEMPERATURE", "");for (var i = 0; i < rooms.length; i++) { for (var j = 0; j < rooms[i].members.length; j++) { if (rooms[i].members[j] == chName) { return rooms[i].name; } } } return "unknown";}`[/i][/i][/i]
-
Habe es gerade getestet und bei mir funktioniert es:
var dp = getObject("javascript.1.Sonne.Höhe","rooms"); log("Raum: " + dp.enumNames);` > 10:09:58.792 [info] javascript.1 Start javascript script.js.common.Tests
10:09:58.792 [info] javascript.1 script.js.common.Tests: Raum: Aussen
10:09:58.793 [info] javascript.1 script.js.common.Tests: registered 0 subscriptions and 0 schedules `
-
Ich habe auch Probleme bei der Ermittlung der Räume zu einem Kanal oder Datenpunkt.
Dem Objekt sind mehrere Räume zugeordnet:

Ich bekomme leider nicht die Räume ermittelt:
//id: hm-rpc.0.NEQ0184905.1.LEVEL var raumname = getObject(id, "rooms"); //Ergebnis raumname : //{"def":0,"type":"number","read":true,"write":true,"min":0,"max":100,"unit":"%","role":"level.dimmer","workingID":"WORKING","name":"K14_110_WZ_Licht_LED_Dimmer.LEVEL"},"native":{"CONTROL":"DIMMER.LEVEL","DEFAULT":0,"FLAGS":1,"ID":"LEVEL","MAX":1,"MIN":0,"OPERATIONS":7,"TAB_ORDER":0,"TYPE":"FLOAT","UNIT":"100%"},"_id":"hm-rpc.0.NEQ0184905.1.LEVEL","acl":{"object":1636,"state":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"},"enumIds":[],"enumNames":[]}Ist vielleicht noch verständlich, da die Räume auf dem übergerodeten Objekt definiert sind. Aber hier gibt es auch keinen Raum:
//channelname= hm-rpc.0.NEQ0184905.1 var raumname = getObject(channelname, true); //Ergebnis raumname: //{"ADDRESS":"NEQ0184905:1","AES_ACTIVE":0,"DIRECTION":2,"FLAGS":1,"INDEX":1,"LINK_SOURCE_ROLES":"","LINK_TARGET_ROLES":"SWITCH WCS_TIPTRONIC_SENSOR WEATHER_CS","PARAMSETS":["LINK","MASTER","VALUES"],"PARENT":"NEQ0184905","PARENT_TYPE":"HM-LC-RGBW-WM","TYPE":"DIMMER","VERSION":41},"acl":{"object":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"},"enumIds":["enum.functions.Licht"],"enumNames":["Licht"]}Wie kann ich die Räume (sind 2) zum Kanal oder Datenpunkt ermitteln?
Hier das gesamte Script:
/* Status Zahl Lichter zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Licht" erstellt: 17.06.2015 nach diesem Vorbild: viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564 23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt Log Ausgabe auskommentiert 05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php ... t=20#p9267 24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens) 06.05.2016 Datenpunkt für Ansagen zugefügt 02.07.2016 abgeschaltet, da Fehler 03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer search statt indexOf und RegEx für Suche nach Virtuellen Kanälen 27.11.2016 Verschoben in Status Code optimiert 23.12.2016 Räume eingebaut */ var logging = true; var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein', idAnzahl = 'javascript.0.Status.Lichter.Anzahl', idText = 'javascript.0.Status.Lichter.Text', idRaum = 'javascript.0.Status.Lichter.Raum', idAnsage = 'javascript.0.Status.Lichter.Ansage', idUG = 'javascript.0.Status.Lichter.Untergeschoss', idEG = 'javascript.0.Status.Lichter.Erdgeschoss', idOG = 'javascript.0.Status.Lichter.Obergeschoss', idDG = 'javascript.0.Status.Lichter.Dachgeschoss'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter type: 'number', name: 'Anzahl aller Lichter', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der eingeschalteten Lichter', min: 0, def: 0, role: 'value' }); createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen type: 'string', name: 'Eingeschaltete Lichter', desc: 'Namen der eingeschalteten Lichter', def: ' ', role: 'value' }); createState(idAnsage, { type: 'string', name: 'Eingeschaltete Lichter (Ansage)', desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)', def: ' ', role: 'value' }); createState(idRaum, { // Räume, in denen Lichter brennen type: 'string', name: 'Räume mit eingeschalteten Lichter', desc: 'Namen der Räume, in denen Lichter eingeschaltet sind', def: ' ', role: 'value' }); var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht")'); // Gewerk Licht var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="Licht")'); function checkDevices(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; var textRaum = []; if (logging) { log('++++++ Lichter Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen var channelid = id.substring(0, id.indexOf(".STATE")); //.state aus Text entfernen //var raumname = getObject(id, "rooms"); var raumname = getObject(channelid, "rooms"); // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { if (logging) { log('Kanal: ' + name + ' - Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt if (logging) { log('id: ' + id); log('devicename: ' + devicename); log('channelid: ' + channelid); log('Object: ' + JSON.stringify(obj)); log('Räume: ' + JSON.stringify(raumname)); } ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // ENDE VK-Abfrage }); if (logging) log('#### DIMMER ##### '); cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = obj.common.name; var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen var channelid = id.substring(0, id.indexOf(".LEVEL")); //.state aus Text entfernen var raumname = getObject(channelid, "rooms"); //var raumname = getObject(channelid, true); //var raumname = getObject(id, "rooms"); // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) // if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten if (logging) { log('Kanal: ' + name + ' - Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 if (logging) { log('id: ' + id); log('devicename: ' + devicename); log('channelid: ' + channelid); log('Object: ' + JSON.stringify(obj)); log('Räume: ' + JSON.stringify(raumname)); log('-------'); } ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // Ende Abfrage VK }); // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht // setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt } // Trigger cacheSelectorState.on(function (obj) { // bei Zustandänderung *.STATE im Gewerk Licht if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); cacheSelectorLevel.on(function (obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); function main() { setTimeout(function () { if (logging) log('Auslöser Skriptstart'); checkDevices(); }, 2000); } main(); // Skriptstart-Auslöser // Aufbereitung für Ansage function strip_tags(data) { var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " "); return (rueckgabe); } on(idText, function (obj) { var text = obj.state.val; text = (getState(idAnzahl).val > 0) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet'; setState(idAnsage, text); });etwas einfacher:
var dp = getObject("hm-rpc.0.NEQ0184905.1.LEVEL","rooms"); log ("Raum: " + dp.enumNames); log ("RaumID: " + dp.enumIds); var dp = getObject("hm-rpc.0.NEQ0184905.1","rooms"); log ("Raum: " + dp.enumNames); log ("RaumID: " + dp.enumIds); var dp = getObject("hm-rpc.0.NEQ0184905","rooms"); log ("Raum: " + dp.enumNames); log ("RaumID: " + dp.enumIds);Ergebnis:
23:14:07.292 [info] javascript.0 script.js.common.Test: Raum: 23:14:07.292 [info] javascript.0 script.js.common.Test: RaumID: 23:14:07.292 [info] javascript.0 script.js.common.Test: Raum: 23:14:07.292 [info] javascript.0 script.js.common.Test: RaumID: 23:14:07.292 [info] javascript.0 script.js.common.Test: Raum: 23:14:07.292 [info] javascript.0 script.js.common.Test: RaumID: -
Hi Robsdobs,
sollte wie in dem Beispiel funktionieren.
Wenn ich bei mir den Beispielcode in folgendes ändere:
var dp = getObject("hm-rpc.0.LEQXXXXXXX.1.LEVEL","rooms"); log("Raum: " + dp.enumNames);Bekomme ich folgende Ausgabe:
20:41:49.768 [info] javascript.0 Stop script script.js.test 20:41:51.693 [info] javascript.0 Start javascript script.js.test 20:41:51.693 [info] javascript.0 script.js.test: Raum: Wohnzimmersofern in Homematic definiert. Geht das bei dir nicht?
Gruß
Steffen
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden