Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Raumname ermitteln

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Raumname ermitteln

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mamoel last edited by

      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?
      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        Hast Du es mal so versucht ?

            var obj   = getObject(id, 'rooms');
            var rooms = obj.enumNames;
        
        1 Reply Last reply Reply Quote 0
        • M
          mamoel last edited by

          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]

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            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 `

            1 Reply Last reply Reply Quote 0
            • M
              mamoel last edited by

              Vielen Dank! Keine Ahnung, was ich vorhin falsch gemacht habe, aber egal - jetzt funktioniert es.

              1 Reply Last reply Reply Quote 0
              • R
                robsdobs last edited by

                Ich habe auch Probleme bei der Ermittlung der Räume zu einem Kanal oder Datenpunkt.

                Dem Objekt sind mehrere Räume zugeordnet:
                1367_2017-12-03_22h51_31.png

                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:
                
                1 Reply Last reply Reply Quote 0
                • Peoples
                  Peoples last edited by

                  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

                  1 Reply Last reply Reply Quote 0
                  • R
                    robsdobs last edited by

                    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

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    781
                    Online

                    31.7k
                    Users

                    79.8k
                    Topics

                    1.3m
                    Posts

                    4
                    8
                    2705
                    Loading More Posts
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes
                    Reply
                    • Reply as topic
                    Log in to reply
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                    The ioBroker Community 2014-2023
                    logo