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?
-
Hast Du es mal so versucht ?
var obj = getObject(id, 'rooms'); var rooms = obj.enumNames;
-
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 `
-
Vielen Dank! Keine Ahnung, was ich vorhin falsch gemacht habe, aber egal - jetzt funktioniert es.
-
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: Wohnzimmer
sofern in Homematic definiert. Geht das bei dir nicht?
Gruß
Steffen
-
Nein, geht leider nicht.
Ich habe meine Kanäle auch mehr als einem Raum zugewiesen. Eigentlich sollte dann ein Array mit allen Räumen zurückgeliefert werden.
Gesendet von meinem A0001 mit Tapatalk