Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Objekt-ID aus Objektnamen ermitteln ?

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Objekt-ID aus Objektnamen ermitteln ?

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

      Wie kann ich außerhalb von "on / subscribe" aus dem Objektnamen die id ermitteln ?

      Voraussetzung: Der Name ist genau einmal vorhanden.

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

        @paul53:

        Wie kann ich außerhalb von "on / subscribe" aus dem Objektnamen die id ermitteln ?

        Voraussetzung: Der Name ist genau einmal vorhanden. `

        ### getIdByName 
            getIdByName(name, alwaysArray)
        
        returns id of the object with given name. If there are more than one object with this name the result will be an array. If _alwaysArray_ flag is set, the result will be always an array if some ID found.
        
        

        Aber nur in der 0.5.4

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

          Danke für die Ergänzung 😄

          Würde ich gern testen, aber zur Zeit scheint es Probleme mit dem Zugriff auf GitHub zu geben.

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

            Ist mit noch eingefallen, dass auch das funktionieren sollte:

            $('channel[name=MyName]').each(function (id) {
                log(id + ' - ' + getObject(id).common.name);
            });
            $('state[name=MyName]').each(function (id) {
                log(id + ' - ' + getObject(id).common.name);
            });
            
            
            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              Beide Varianten hatte ich schon versucht.

              Bei der 1. Variante passiert nichts.

              Die 2. Variante liefert:

              javascript-0 2015-08-18 14:55:54 error script.js.Wohnen_Heizregler: TypeError: Cannot read property 'common' of undefined

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

                Welchen Namen suchst du? Kannst du das Objekt, welches du suchst, zeigen?
                3473_home.txt
                3473_home2.txt

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

                  Ich benötige die ID für die Initialisierung von Ist- und Sollwert bei Script-Start, da es sehr lange dauern kann, bis sich der Sollwert ändert.

                  // 2-Punkt-Regler Raumheizung
                  
                  // Raumkurzname am Anfang des Datenpunktnamen
                  var raum = "Wohnen";
                  // halbe Hysterese in K
                  var hh = 0.1;
                  
                  function hys(x, w) {
                      var dpname = raum + ".Heizen";
                      if (x <= w - hh) { setState(dpname, true);}
                      else if (x >= w + hh) { setState(dpname, false);}
                      log("2-Punkt: " + x + ", " + w);
                  }
                  
                  var xname = raum + ".Temperatur";
                  on({name: xname}, function(dp) {
                      this.x = dp.newState.val;
                      hys(this.x, this.w);
                  });
                  
                  var wname = raum + ".Sollwert";
                  on({name: wname}, function(dp) {
                      this.w = dp.newState.val;
                      hys(this.x, this.w);
                  });
                  
                  // Script start
                  var xid = "hm-rpc.1.CUX9002002.1.TEMPERATURE";  //getIdByName(xname);
                  this.x = getState(xid).val;
                  log("x: " + this.x);
                  
                  var wid = "hm-rpc.1.CUX9002002.2.SETPOINT";   //getIdByName(wname);
                  this.w = getState(wid).val;
                  log("w: " + this.w);
                  
                  

                  Das sind die beiden Objekte:
                  493_wohnen_sollwert.jpg
                  493_wohnen_temperatur.jpg

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

                    Die Aktualisierung über ioBroker funktioniert noch immer nicht. Deshalb habe ich zum Testen mir die Datei "javascript.js" aus dem GitHub kopiert und ausgetauscht.

                    Die Funktion "getIdByName(name)" funktioniert einwandfrei 😄 :
                    ` > javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: registered 2 subscriptions and 0 schedules

                    javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: 2-Punkt: 25.8, 22.5

                    javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: w: hm-rpc.1.CUX9002002.2.SETPOINT

                    javascript-0 2015-08-18 17:14:37 info script.js.Wohnen_Heizregler: x: hm-rpc.1.CUX9002002.1.TEMPERATURE

                    javascript-0 2015-08-18 17:14:37 info Start javascript script.js.Wohnen_Heizregler `
                    mit diesem Scriptende:

                    // Script start
                    var xid = getIdByName(xname);  //"hm-rpc.1.CUX9002002.1.TEMPERATURE";
                    this.x = getState(xid).val;
                    log("x: " + xid);
                    
                    var wid = getIdByName(wname);  //"hm-rpc.1.CUX9002002.2.SETPOINT";
                    this.w = getState(wid).val;
                    log("w: " + wid);
                    
                    hys(this.x, this.w);
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 last edited by

                      Hat man erst einmal die Objekt-ID des Datenpunktes, kann man das Script vereinfachen:

                      // 2-Punkt-Regler Raumheizung
                      
                      // Raumkurzname am Anfang des Datenpunktnamen
                      var raum = "Wohnen";
                      // halbe Hysterese in K
                      var hh = 0.1;
                      
                      var xid = getIdByName(raum + ".Temperatur");
                      var wid = getIdByName(raum + ".Sollwert");
                      var yid = getIdByName(raum + ".Heizen");
                      
                      function hys() {
                          var x = getState(xid).val;
                          var w = getState(wid).val;
                          if (x <= w - hh) { setState(yid, "Ein");}
                          else if (x >= w + hh) { setState(yid, "Aus");}
                      }
                      
                      on(xid, function() {
                          hys();
                      });
                      
                      on(wid, function() {
                          hys();
                      });
                      
                      // Script start
                      hys();
                      
                      

                      Könnte "getState()" auch mit dem Namen arbeiten, würde die ID nur selten benötigt werden.

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

                        @paul53:

                        Hat man erst einmal die Objekt-ID des Datenpunktes, kann man das Script vereinfachen:

                        // 2-Punkt-Regler Raumheizung
                        
                        // Raumkurzname am Anfang des Datenpunktnamen
                        var raum = "Wohnen";
                        // halbe Hysterese in K
                        var hh = 0.1;
                        
                        var xid = getIdByName(raum + ".Temperatur");
                        var wid = getIdByName(raum + ".Sollwert");
                        
                        function hys() {
                            var yname = raum + ".Heizen";
                            var x = getState(xid).val;
                            var w = getState(wid).val;
                            if (x <= w - hh) { setState(yname, true);}
                            else if (x >= w + hh) { setState(yname, false);}
                        }
                        
                        on(xid, function() {
                            hys();
                        });
                        
                        on(wid, function() {
                            hys();
                        });
                        
                        // Script start
                        hys();
                        
                        

                        Könnte "getState()" auch mit dem Namen arbeiten, würde die ID nur selten benötigt werden. `
                        Nach dem ich getIdByName implementiert habe wird es einfach getState über Name zu implementieren.

                        Was mache ich aber, falls man zwei States mit dem gleichen Namen habe?
                        1148_wallpaper.jpg

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

                          @Bluefox:

                          Was mache ich aber, falls man zwei States mit dem gleichen Namen habe? `
                          Den ersten gefundenen State nehmen, so wie HM Script.

                          Noch besser: Einen Prüflauf implementieren, der auf mehrfache Vergabe von Namen testet.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          674
                          Online

                          31.9k
                          Users

                          80.2k
                          Topics

                          1.3m
                          Posts

                          2
                          11
                          3816
                          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