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.
    • 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