Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Vielzahl von Aliasen schnell erstellen

    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

    Vielzahl von Aliasen schnell erstellen

    This topic has been deleted. Only users with topic management privileges can see it.
    • liv-in-sky
      liv-in-sky @Markus84 last edited by liv-in-sky

      @markus84

      hier das script - MUSS ABER NOCH FÜR DICH ANGEGLICHEN WERDEN

      es wird zum test nur ein ordenr mit allen unter-dp als alias angelegt - bei mir im sonoff adapter

      Image 2.png

      /**************************************************************
      Github - https://github.com/xCruziX/ioBroker-Creating-Alias/blob/master/CreateAlias.js
         			Changelog
      Version 1.1.4
      - fix error by using bCreateAliasPath and bConvertExistingPath (has no target 9/Error creating alias-path)
      **************************************************************/
      
      /**************************************
         	Flags /
         	Variablen
      ***************************************/
      
      // typeAlias = 'boolean'; // oder 'number'
      // read = "val == 'Ein' ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch  
      // write = "val ? 'Ein' : 'Aus'";
      // nameAlias = 'Licht Haustür';
      // role = 'switch';
      // desc = 'per Script erstellt';
      // min = 0; // nur Zahlen
      // max = 100; // nur Zahlen
      // unit = '%'; // nur für Zahlen
      // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
      
      
      let bCreateAliasPath = true;  // If this flag is true, each folder is created seperately so rooms and functions can be assigned.
      
      /*
      Requirements: bCreateAliasPath == true
      If this flag is true, existing folders in the path will be converted so rooms and functions can be assigned.
      */
      let bConvertExistingPath = true;
      
      /***************************************
         	Don't change anything from here /
         	Ab hier nichts verändern
      ***************************************/
      
      let arEnum = [];
      let arId = [];
      let timeoutAssignEnum;
      var callbackAlias = undefined;
      function createAlias(idSrc, idDst,raum, gewerk,typeAlias, read, write, nameAlias, role, desc, min, max, unit, states) {
       if(!idDst.includes('alias.0.'))
           idDst = 'alias.0.' + idDst;
       if(!existsObject(idSrc))
       {
           log('Source-Id ' + idSrc +' does not exists.','warn');
           return;
       }
       
       // Create the object Path for alias id, 
       // so you can assign rooms and function to the parents
       var createAliasPath = (id) => {
            if(bCreateAliasPath){
                 let lisMergedIds = [];
                 let mergedId = 'alias.0';
                 id = id.replace(mergedId + '.', ''); // Remove prefix alias so it will not be changed
                 let split = id.split('.'); 
                 for(let i=0;i<split.length-1;i++){
                     mergedId += '.' + split[i];
                     lisMergedIds.push(mergedId);
                 }
                 
                 function path(){
                     if(lisMergedIds.length == 0) {
                         alias();
                         return;
                     }
                     let tmpId = lisMergedIds[0];
                     lisMergedIds.splice(0,1); // remove element
                     if(!existsObject(tmpId) || bConvertExistingPath){ // not exists
                         let obj;
                         if(existsObject(tmpId))
                             obj = getObject(tmpId);
                         else
                             obj = {};
      
                         let bApply = false;
                         if(obj != undefined){
                             if(obj.type == undefined || String(obj.type) != 'meta'){
                                 obj.type = 'meta';
                                 bApply = true;
                             }
                             if(obj.common == undefined){
                                 obj.common = {};
                                 obj.common.type = 'meta.folder';
                                 bApply = true;
                             }
                             else if(obj.common.type == undefined || String(obj.common.type) != 'meta.folder'){
                                 obj.common.type = 'meta.folder';
                                 bApply = true;
                             }
                             if(obj.native == undefined){
                                 obj.native = {};
                                 bApply = true;
                             }
                         }
                         else{
                             path();
                             log('Object is undefined');
                             return;
                         }
                         
      
                         if(bApply){
                             setObject(tmpId, obj, (err) =>{
                             if(!err){
                                 log('Created Alias-Path ' + tmpId);
                                 path();
                             }
                             else
                                 log('Error creating alias-path','error');
                         });
                         }
                         else
                             path();
                         
                     }
                 }
                 path();
            }
            else
              alias();
       }
       
       
       function alias(){
           // Create alias object
           
             if(!existsObject(idDst)){
                 let obj = {};
                 obj.type = 'state';
                 obj.common = getObject(idSrc).common;
                 obj.common.alias = {};
                 obj.common.alias.id = idSrc;
                 if(typeAlias !== undefined) 
                     obj.common.type = typeAlias;
                 if(obj.common.read !== undefined) 
                     obj.common.alias.read = read;
                 if(obj.common.write !== undefined) 
                     obj.common.alias.write = write;
                 if(nameAlias !== undefined) 
                     obj.common.name = nameAlias;
                 if(role !== undefined) 
                     obj.common.role = role;
                 if(desc !== undefined) 
                     obj.common.desc = desc;
                 if(min !== undefined) 
                     obj.common.min = min;
                 if(max !== undefined) 
                     obj.common.max = max;
                 if(unit !== undefined) 
                     obj.common.unit = unit;
                 if(states !== undefined) 
                     obj.common.states = states;
      
                 obj.native = {};
                 obj.common.custom = []; // Damit die Zuordnung zu iQontrol, Sql etc. nicht übernommen wird
                 log('Created Alias-State ' + idDst);
                 setObject(idDst, obj,(err) =>{ 
                     if(!err)
                         startAttach(); 
                     else
                         log('Error creating-alias','error');
                 });
             }
             else
                 startAttach();
       }
       
       
       // Save ID and Enum (room or function)
       var attach = (id, enu,value) => {
           if(id.length == 0){
               log('ID has lenght 0, can not attach to enum','warn');
               return;
           }
           if(value.length == 0){
               log('Value has lenght 0','warn');
               return;
           }
         
           let sEnuId = 'enum.' + enu + '.' + value;
           if(enu.length > 0 && existsObject(sEnuId)) 
           {
               let obj = getObject(sEnuId)
               let members = obj.common.members;
               if(!members.includes(id)){
                   arEnum.push(sEnuId);
                   arId.push(id);
               }
           }
           else
        	      log('Can not find enum ' + sEnuId,'warn');
       }
      
      function startAttach(){
         let bRoom = raum !== undefined && raum.length > 0;
         let bGewerk = gewerk !== undefined && gewerk.length > 0;
         
         if(bRoom)
             attach(idDst,'rooms',raum);
         if(bGewerk)
             attach(idDst,'functions',gewerk);
         if(bRoom || bGewerk){
                 if(timeoutAssignEnum){
                     clearTimeout(timeoutAssignEnum);
                     timeoutAssignEnum = null;
                 }
                 timeoutAssignEnum = setTimeout(finishScript,100);
         }
      }
      
       createAliasPath(idDst);
      }
      
      function finishScript(){
         assignEnums();
      }
      
      // Add the saved IDs to the rooms/functions
      function assignEnums(){
      if(arEnum.length == 0 || arId.length == 0){
           return;
      }
      
      if(arEnum.length != arId.length){
           log('Arrays have different size','error');
           return;
      }
      let mapEnumId = new Map();
      
      for(let i=0;i < arEnum.length; i++){
          let enu = arEnum[i];
          let id = arId[i];
          if(existsObject(id)){
         	 let obj = getObject(enu)
         	 let members;
         	 if(!mapEnumId.has(enu)){
         		 members = obj.common.members;
         		 mapEnumId.set(enu,members);
         	 }
         	 else
         		 members = mapEnumId.get(enu);    
         	 if(!members.includes(id)){
         		  log("Adding " + id + " to " + enu);
         		  members.push(id);
         	 }	      
          }
          else
              log('Can not find Alias ' + id,'error');
      }
       
       function setMembers(members,enu,map){
           let obj = getObject(enu);
           obj.common.members = members;
           setObject(enu,obj);
       }
       mapEnumId.forEach(setMembers);
      }
      
      //createAlias('sonoff.0.USBSwitch9.POWER', 'Zimmer.Desk.Luefter.Smoke',undefined, undefined, 'bool', undefined, undefined, 'Zimmer-Desk-Luefter-Smoke', undefined, 'per Script erstellt', undefined, undefined, undefined, undefined)
      
      $('sonoff.1.FontaHomeDose1.*').each(function(id, i) { 
      let nameAlias=id.replace("sonoff.1.",""); nameAlias=nameAlias.replace(".","-"); 
      //log(id.replace("sonoff.1.","Sonoff-"))
      createAlias(id,id.replace("sonoff.1.","Sonoff-Decices.Sonoff-"),undefined, undefined, typeof getState(id).val, undefined, undefined,nameAlias, undefined, 'per Script erstellt', undefined, undefined, undefined, undefined)
      
      });
      
      
      
      
      
      
      
      
      
      
      

      ab zeile 264 ist wichtig

      M 1 Reply Last reply Reply Quote 2
      • liv-in-sky
        liv-in-sky @Markus84 last edited by

        @markus84 sagte in Vielzahl von Aliasen schnell erstellen:

        Wenn sich der ursprüngliche Datenpunkt ändern sollte, also z.B. von true/false auf eine Zahl, ändert sich dann eigentlich ein angelegter Alias automatisch mit (natürlich nur wenn man keine Konvertierung eingebaut hat beim Anlegen des Alias)?

        habe ich noch nicht getestet, da man true false in boolean-dp schreibt und eine zahl in number-dp - sollte do nicht unbedingt verwendet werden

        1 Reply Last reply Reply Quote 0
        • liv-in-sky
          liv-in-sky @Markus84 last edited by

          @markus84

          $('sonoff.1.FontaHomeDose1.*').each(function(id, i) { 
          let nameAlias=id.replace("sonoff.1.",""); nameAlias=nameAlias.replace(".","-"); 
          //log(id.replace("sonoff.1.","Sonoff-"))
          createAlias(id,id.replace("sonoff.1.","Sonoff-Decices.Sonoff-"),undefined, undefined, typeof getState(id).val, undefined, undefined,nameAlias, undefined, 'per Script erstellt', undefined, undefined, undefined, undefined)
          
           });
          

          das ist die schleife

          teste erst mal mit einem device - nach test kannst du dann in der ersten zeile die schleife ändern

          1 Reply Last reply Reply Quote 0
          • M
            Markus84 @liv-in-sky last edited by

            @liv-in-sky Erst einmal besten Dank! Hast du zufällig irgendwo eine Erklärung dazu?

            Ich vermute in Zeile 264 muss ich den ursprünglichen Ordner auswählen?
            In Zeile 265 wird ein Zeichen ersetzt, richtig? Wofür brauche ich das?
            Zeile 266 verstehe ich leider überhaupt nicht...
            Und Zeile 267 legt den neuen Ordnernamen unter alias.0. fest?

            liv-in-sky 2 Replies Last reply Reply Quote 0
            • liv-in-sky
              liv-in-sky @Markus84 last edited by liv-in-sky

              @markus84

              • 264 - ist die schleife - in meinem beispiel scanne ich nur ein device - fontahomeedose - mit allen unterordner und dp
              • 265 - ja - da werden zeichen ersetzt, da ich keine punkte gebrauchen kann
              • 266 - ist ein log - aber deaktiviert - daher nicht ausgeführt - brauchte ich zum testen (heißt debug in blockly)
              • 267 -ja
              liv-in-sky 1 Reply Last reply Reply Quote 0
              • liv-in-sky
                liv-in-sky @liv-in-sky last edited by liv-in-sky

                @markus84 poste die schleife hier im thread, bevor du testest - dann schauen wir uns das nochmal an

                1 Reply Last reply Reply Quote 0
                • liv-in-sky
                  liv-in-sky @Markus84 last edited by

                  @markus84

                  das script sollte nur einmal aktiviert werden - dann legt es alles an - anschliessend deaktiviere das script, sonnst werden die aliase immer bei jeden neustart angelegt - macht zwar nix kaputt - aber erzeugt fehlermeldungen, da sis ja schon exisitieren

                  das ist ein "sonderscript", da es nur einmal laufen muss - bei standard script's ist das anders - die sind immer aktiviert

                  du kanst auch jederzeit deine aliase löschen und nochmal machen, wenn dir was nicht gefällt - natürlich bevor du sie in scripte oder vis einbindest

                  M 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @Markus84 last edited by paul53

                    @markus84 sagte: Gibt es eine Möglichkeit ordnerweise Aliase zu erstellen?

                    Das wäre Ressourcenverschwendung. Aliase sollten nur zu den Datenpunkten erstellt werden, die in einer Visualisierung oder in einer Logik (Skript) verwendet werden. Das geht nicht automatisch.

                    liv-in-sky 1 Reply Last reply Reply Quote 0
                    • liv-in-sky
                      liv-in-sky @paul53 last edited by

                      @paul53

                      da stimme ich zu - man könnte aber bestimmte datenpunkte bestimmen - also eine liste machen, mit dp, von denen man das haben will - das spart einiges

                      M da_Woody 2 Replies Last reply Reply Quote 0
                      • M
                        Markus84 @liv-in-sky last edited by

                        @liv-in-sky Danke, ich probiere es später aus und melde mich nochmal. Echt top, dass du so viel geholfen hast!

                        @paul53 said in Vielzahl von Aliasen schnell erstellen:

                        @markus84 sagte: Gibt es eine Möglichkeit ordnerweise Aliase zu erstellen?

                        Das wäre Ressourcenverschwendung. Aliase sollten nur zu den Datenpunkten erstellt werden, die in einer Visualisierung oder in einer Logik (Skript) verwendet werden. Das geht nicht automatisch.

                        Naja, ich habe schon vor die Datenpunkte alle in Skripten und/oder in der Vis zu nutzen. Und wenn es nur in einer alles aus Logik ist...

                        A 1 Reply Last reply Reply Quote 0
                        • A
                          Ahnungsbefreit @Markus84 last edited by

                          @markus84 Das ist doch mal wieder die tolle ioBroker Community: Es gibt keine Lösung "out of the box", wie ich oben schon geschrieben habe, und trotzdem hast Du ruck-zuck Hilfe mit einem genau auf Deinen Fall zugeschnittenen Script!

                          Ohne Leute wie @liv-in-sky und @paul53 wäre das nicht möglich, danke!

                          1 Reply Last reply Reply Quote 3
                          • M
                            Markus84 @liv-in-sky last edited by

                            @liv-in-sky Ich bin leider erst jetzt zum Testen gekommen. Es funktioniert perfekt! Vielen Dank nochmal!

                            1 Reply Last reply Reply Quote 0
                            • da_Woody
                              da_Woody @liv-in-sky last edited by

                              @liv-in-sky diese liste müsstest du aber für jedes gerät ändern! alleine wenn ich mir z.b. fronius, oder grünbeck anschaue, sind da jede menge DP drinnen, die eigentlich gar nicht benützt werden, da es auf die anlage ankommt.
                              ergo ist das mehr als recourcenverschwendung. auch bei jedem anderen gerät gibts DPs wo mir keiner sagen kann, daß er sie eventuell mal in einem script verwenden wird. und wenn, dann kann man diesen alias einfach schnell erstellen.
                              ich weis, es ist verdammt viel arbeit, die aber durch den alias-manager schon mehr als easy geworden ist. ich hab voriges jahr noch für ca 60 devices alles benötigte die alias mit @paul53 's script mühevoll angelegt.
                              IMHO geht der vorteil von alias durch so eine aktion mehr als verloren, weil auch die übersichtlichkeit wieder verloren geht.
                              von raum und ebenen, sontigen zuordnungen ganz zu schweigen...
                              just my 2 €...

                              liv-in-sky 1 Reply Last reply Reply Quote 0
                              • liv-in-sky
                                liv-in-sky @da_Woody last edited by liv-in-sky

                                @da_woody

                                ich hatte ja erwähnt, mit einer liste zu arbeiten - ich würde mir ein array einbauen , welche die dp beinhaltet, die ich brauche und würde dadurch die masse einschränken - meist braucht man eh nicht mehr wie 3- 5 .

                                @Markus84 wollte aber alle haben

                                EDIT: natürlich müßte diese liste für verschiedene adapter, verschiedene inhalte haben

                                da_Woody 1 Reply Last reply Reply Quote 0
                                • da_Woody
                                  da_Woody @liv-in-sky last edited by

                                  @liv-in-sky yes, i know. war nicht gegen deine idea, aber schwer bei dem thema dem richtigen zu antworten. hats halt dich erwischt... 😉
                                  hrnz, du elender editierer du! fish.gif
                                  genau das meinte ich ja! da verbrauchst du mehr zeit für die listen/arrays erstellen, als es vorteile bringt.
                                  allein bei tasmota. ist das ding ein switch, hängen sensoren dran, u.s.w.
                                  shellys, jedes teil bringt andere DPs mit.

                                  liv-in-sky 1 Reply Last reply Reply Quote 0
                                  • liv-in-sky
                                    liv-in-sky @da_Woody last edited by

                                    @da_woody

                                    das kommt auf die anzahl der devices an -

                                    ein liste mit 5 inhalten ist in 15 sek gemacht - bei 400 devices lohnt sich das

                                    bei 400 geräten ist es auch schwierig noch mit räumen und stockwerken bei der aliaserstellung zu arbeiten - da macht das schon sinn, so einn script zu nutzen

                                    da_Woody 1 Reply Last reply Reply Quote 0
                                    • da_Woody
                                      da_Woody @liv-in-sky last edited by

                                      @liv-in-sky sagte in Vielzahl von Aliasen schnell erstellen:

                                      bei 400 devices lohnt sich das

                                      ja, bei 400 gleichen! 😉
                                      ich habe 80 shellys, ca. 10 verschiedene typen. heisst, 10 listen anlegen. ohne raum zuordnung und so... 😞

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate
                                      FAQ Cloud / IOT
                                      HowTo: Node.js-Update
                                      HowTo: Backup/Restore
                                      Downloads
                                      BLOG

                                      821
                                      Online

                                      31.9k
                                      Users

                                      80.1k
                                      Topics

                                      1.3m
                                      Posts

                                      alias
                                      5
                                      21
                                      1660
                                      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