Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Skript] Namespace für Datenpunkte in Skripten abändern

    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

    [Skript] Namespace für Datenpunkte in Skripten abändern

    This topic has been deleted. Only users with topic management privileges can see it.
    • sigi234
      sigi234 Forum Testing Most Active @liv-in-sky last edited by

      @liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

      die states müssen auch noch "kopiert" werden

      Verstehe Bahnhof?

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

        @sigi234

        wenn du im objecte tab einen export der objecte machst (über datei export) , und diese datei später wieder mit den neuen pfaden importierst, sind die states nicht mit den alten werten gesetzt

        man exportiert und importiert nur die dp-objecte - die dazugehörigen states werden nicht importiert

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

          @sigi234

          Image 2.png

          1 Reply Last reply Reply Quote 0
          • FredF
            FredF Most Active Forum Testing @liv-in-sky last edited by

            @liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

            die states müssen auch noch "kopiert" werden !

            Das habe ich auch schon gemerkt, nur wie kopiert man die states?

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

              @sigi234 sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

              Ok, Zeile 11 muss ich da auch einen Ordner anlegen? Wenn ich const replaceInSystemsDB = false auf true ändere wird ja sofort ins System geschrieben. Ist der Pfad für Windows Systeme?

              Du musst Zeile11 nur dann verändern, wenn Du einen Namespace, der jetzt nicht mehr erlaubt ist, verändern willst. Etwa wenn du jetzt zB MeineDatenpunkte.0 benutzt und sie nach 0_userdata.0 migrieren willst. Schreib da wieder oldNamespace.0 rein wenn das nicht der Fall ist. Ansonsten nutze das Skript halt nur um deine Skripte zu listen.

              Der Fehler bei setState() kommt weil ich einen DP mit type array vorausgesetzt habe. Lasse deinen Type auf string und ändere Zeile 116 in
              setState('0_userdata.0.scriptCheck',JSON.stringify(changesResult));

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

                @fredf

                ich hab ein script, welches einen object-pfad aussliest und eine datei erstellt, die lauter "setState(...) " befehle beinhaltet - damit könnte man das lösen

                momentan habe ich aber noch ein problem damit - wenn ein state einen string enthält. da das script "uralt" ist, muss ich es erst ändern und anpassen - so das es gleich in den neuen state geschrieben wird

                ich poste es, wenn fertig

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

                  @fredf

                  eigentlich sollte das reichen

                  
                  var fs = require('fs');
                  
                  let oldObjectPath="controll-own.0.AAATEST"
                  let newObjectPath="0_userdata.0.CONTROL-OWN.AAATEST"
                  
                  
                      var cacheSelectorState = $(`state[state.id=${oldObjectPath}.*]`);
                  cacheSelectorState.each(function (id, i) {
                      var val1 = getState(id).val;
                         if (val1 == null ) 
                            {log(id + " hat keinen state");} 
                       else {
                             setState(id.replace(oldObjectPath,newObjectPath),getState(id).val )
                      };});
                  
                  
                  
                  

                  du mußt fs in das javascript instanz setting eintragen und den alten und neuen pfad

                  • hier im script habe ich einen unterordner eingetragen - zum testen - da könnte auch
                  let oldObjectPath="controll-own.0"
                  let newObjectPath="0_userdata.0.CONTROL-OWN"
                  

                  drinstehen

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

                    @fastfoot

                    man müßte doch auch ein script machen können, das die einnzelnen vis views ändert

                    Image 4.png

                    das script könnte die vis-view.json in vis-view.json.new anlegen (mit geänderten werten) ,dann könnte man iobroker abschalten und diesse files ersetzen/umbenennen - bin mir nicht mehr sicher, ob es reicht nur den vis-adapter zu deaktivieren

                    dann müßte nur noch unter dem scripte-tab und dem css-stab im vis-editor überprüft werden, ob da auch noch was drin steht, was geändert werden muss

                    1 Reply Last reply Reply Quote 0
                    • FredF
                      FredF Most Active Forum Testing @liv-in-sky last edited by

                      @liv-in-sky 👍 Das werde ich testen

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

                        @fastfoot

                        die änderungen für die vis - alle views auf einmal - habe mal ein script gemacht - wärst du so nett, mal drüber zu sehen - ob dir etwas auffällt

                        für den test, habe ich eine noch eine einschränkung drin, damit nur ein file bearbeitet wird

                        ergebnis:

                        Image 5.png

                        script:

                        
                        var myPath="/opt/iobroker/iobroker-data/files/vis.0";
                        let oldObjectPath="controll-own.0"
                        let newObjectPath="0_userdata.0.CONTROL-OWN"
                        
                        
                        let re = new RegExp( oldObjectPath, "g" );
                        
                        
                        var myRootArr=[];
                        var myRootArrFiles=[];
                        var fs = require('fs');  
                        
                        var _getAllFilesFromFolder = function(dir) {
                        var filesystem = require("fs");
                        var results = [];
                        
                        
                           filesystem.readdirSync(dir).forEach(function(file) {
                                 file = dir+'/'+file;
                               var stat = filesystem.statSync(file);
                               if (stat && stat.isDirectory()) {
                                    results = results.concat(_getAllFilesFromFolder(file))
                               } else results.push(file);
                           });
                            return results;
                        };
                        
                        //log(_getAllFilesFromFolder("/opt/iobroker/scripte-backup/Armin_Schalter/FUTRO").toString())
                        
                        function getDirectories(path) {
                         return fs.readdirSync(path).filter(function (file) {
                           return fs.statSync(path+'/'+file).isDirectory();
                         });
                        }
                        
                        
                        
                        async function sammleDaten () {
                          // return new Promise((resolve) => {
                        
                        myRootArr=getDirectories(myPath)
                        
                        myRootArrFiles=_getAllFilesFromFolder(myPath)
                        
                        //log(isScriptActive('Armin_Schalter.AA-TABELLEN.N_E_U_E_T_A_B_E_L_L_E_N.AATelegramDelete.Skript_111').toString());
                        //myRootArrFiles.toString())
                        for(let z=0;z<myRootArrFiles.length;z++){
                         if(myRootArrFiles[z].includes("vis-views.json")) { //log(myRootArrFiles[z]);
                               let  content=fs.readFileSync( myRootArrFiles[z], 'utf8' );
                             if(z==182) {log( myRootArrFiles[z])
                             content=content.replace(re,newObjectPath)
                             fs.writeFile(myRootArrFiles[z] + ".new", content, e => {
                                          if (e) log('Fehler beim Schreiben der Datei:' + e.error)
                                      })
                             }
                          
                           
                        }
                        
                        
                        
                        }}
                        
                        async function doStuff() {
                        await sammleDaten();
                        
                        }
                        
                        
                        doStuff()
                        
                        
                        
                        
                        

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

                          @liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

                          wärst du so nett, mal drüber zu sehen - ob dir etwas auffällt

                          klar mache ich, wird aber etwas dauern, bin unterwegs

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

                            @liv-in-sky warum in allen Dateien suchen? Die vis-views.json sollte es doch tun.
                            Bei deinen Funktionen habe ich nicht recht durchgeblickt, deshalb so:

                            hier für Mutige, habe nicht einmal die Vis gestoppt. Seltsamerweise funktioniert readFileAsync() hier nicht, mit keinem meiner Files kommt da was zurück, deswegen mit Callback. Trau Dich😬

                            /**
                             * Zweck:   Ändert Namespace in VIS
                             */
                            
                            const visPath = "vis.0";
                            let oldObjectPath = "controll-own.0";
                            let newObjectPath = "0_userdata.0.CONTROL-OWN";
                            
                            
                            let re = new RegExp(oldObjectPath, "g");
                            
                            readFile(visPath, 'main/vis-views.json', function (e,visData){
                                if(e){
                                    log('Fehler: ' + e);
                                    return;
                                }
                                //Backup
                                writeFileAsync(visPath, 'main/vis-views.json.bak', visData);
                                //just switch :-)
                                writeFileAsync(visPath, 'main/vis-views.json', visData.replace(re,newObjectPath))
                            });
                            
                            liv-in-sky 1 Reply Last reply Reply Quote 0
                            • liv-in-sky
                              liv-in-sky @fastfoot last edited by

                              @fastfoot

                              die vis muss gestoppt sein, ansonsten wird beim neustart alles überschrieben (was im cache ist)

                              danke -bin etwas verwirrt - es gibt doch pro vis-view eine datei - also brauch ich eine schleife, die alle vis-view-verzeichnisse durchgeht

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

                                @liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

                                @fastfoot

                                die vis muss gestoppt sein, ansonsten wird beim neustart alles überschrieben (was im cache ist)

                                danke -bin etwas verwirrt - es gibt doch pro vis-view eine datei - also brauch ich eine schleife, die alle vis-view-verzeichnisse durchgeht

                                writeFile() schreibt direkt ins System(und danach auch ins Filesystem). ich habe nur eine einzige Datei in main(plus die css). Nach einem Browserreload waren die neuen Dateipunkte aktiv. Ich hatte nur von 0_userdata.0 zu 0_userdata.1 geswitcht, woraufhin die VIS die natürlich moniert hatte. Dann wieder zurück und reload und alles war wieder da.

                                writeFile() nicht verwechseln mit fs.writeFile(), zweitere schreibt ins Dateisystem und würde einen Upload erfordern!

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

                                  @fastfoot ah ok - ich muss writefile ändern - guter tipp

                                  ich wollte halt die alten files behalten und bei gestoppter vis die dateien einzeln umbenennen - danach vis wieder starten - so mache ich es, wenn ich in einer view "zombie"-widgets habe und diese rauslöschen muss (aus der vis-view.json) - kommt ab und an vor.

                                  bin mir noch nicht sicher, ob ich direkt ins system schreiben soll, nicht das bei der konvertierung etwas schief geht - evtl mach ich einen file rename mit*.bak und erzeuge dann die neuen files mit dem richtigen namen

                                  hier siehst du die ordnerstruktur für alle views https://forum.iobroker.net/post/666097 - jeder ordner unter vis.0 ist eine view - ist nicht wie bei den objects, wo alles in einer datei steht

                                  werd mir morgen wieder zeit dafür nehmen und nochmal drüber nachdenken

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

                                    @liv-in-sky Ah jetzt verstehe ich, ich habe nur eine kleine rudimentäre VIS 🙂 Dennoch kamen mir deine Funktionen etwas suspekt vor, hatte auch nur rot im Editor, lief allerdings.

                                    In meinem Beispiel wird ja auch ein Backup der vis-views.json gemacht, die findet sich auch im Filesystem wieder.

                                    Dennoch wüsste ich nicht wie man alle Files direkt im System findet(so wie man DP mit Selektor findet), da braucht es dann wohl das Dateisystem so wie du es gemacht hast. Wenn du die Dateien nur im Filesystem abänderst und zusätzlich eine .bak Datei anlegst, dann ändert sich an der VIS aber erstmal garnichts. Damit es das tut musst du nur in Adaper auf Upload Files klicken, dann erst ändert sich die VIS. Wenns dann nicht klappt die .bak umbenennen, neuer Upload und gut ist. writeFile() ist quasi der Upload für eine einzelne Datei.

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

                                      @fastfoot sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

                                      Dennoch kamen mir deine Funktionen etwas suspekt vor,

                                      mir auch - hatte ich aus dem internet - für etwas anderes genutzt und einfach mal kopiert - es macht , was es soll - geht sicher einfacher

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

                                        @fastfoot sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

                                        hatte auch nur rot im Editor

                                        seltsam - bei mir ist da nix rot

                                        ist mit wieder eingefallen - ich wollte in der vis das filesystem abbilden - um evtl mp3's asuszuwählen und diese an einen audio-streamer zu senden - dabei habe ich diesen code gefunden

                                        1 Reply Last reply Reply Quote 0
                                        • F
                                          fastfoot last edited by

                                          @liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:

                                          @fastfoot sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:
                                          seltsam - bei mir ist da nix rot

                                          mein Editor zickt des Öfteren, aber da war zB ein callback mit return, was eig. keinen Sinn macht

                                          ist mit wieder eingefallen - ich wollte in der vis das filesystem abbilden - um evtl mp3's asuszuwählen und diese an einen audio-streamer zu senden - dabei habe ich diesen code gefunden

                                          hier eine etwas aufgräumtere Version. Es wird ein Backup angelegt und eine neue Datei mit Endung .new. Die css wird nicht angefasst, kannst Du in Zeile 22 ändern.

                                          Nach dem Lauf des Skripts muss wie schon erwähnt ein Upload erfolgen(Nach Rename) oder der auskommentierte Teil benutzt werden.

                                          /**
                                          * Zweck:   Ändert Namespace in VIS
                                          * Datum:   18.08.2021
                                          * Autor:   @fastfoot nach einer Vorlage von @liv-in-sky
                                          * Forum:   https://forum.iobroker.net/topic/47113/skript-namespace-für-datenpunkte-in-skripten-abändern/25
                                          */
                                          const fs = require('fs');
                                          const dbg = false;
                                          let visPath = "/opt/iobroker/iobroker-data/files/vis.0/";
                                          let oldObjectPath = "controll-own.0";
                                          let newObjectPath = "0_userdata.0.CONTROL-OWN";
                                          const restoreInSystem = false;
                                          let myVisFiles = [];
                                          let re = new RegExp(oldObjectPath, "g");
                                          
                                          function getFilesFromPath(path){
                                             let filesInPath = [];
                                             filesInPath = fs.readdirSync(path,'utf8');
                                             filesInPath.forEach(file => {
                                                 const filePath = path + '/' + file;
                                                 if(fs.statSync(filePath).isFile()) {
                                                     if(file === 'vis-views.json' || file === 'xxxvis-user.css')
                                                         myVisFiles.push(filePath);
                                                 } else{
                                                     //if(dbg) log(filePath);
                                                     getFilesFromPath(filePath);
                                                 }
                                             })
                                          }
                                          
                                          function doIt(){
                                             if(visPath.lastIndexOf('/') === visPath.length - 1) visPath = visPath.substring(0,visPath.lastIndexOf('/'));
                                             //füllt Array myVisFiles
                                             getFilesFromPath(visPath);
                                             myVisFiles.forEach(file => {
                                                 let visPathSystem = file.split('/').slice(6).join('/') ;
                                                 //if(dbg) log(visPathSystem);
                                                 let content = fs.readFileSync(file, 'utf8');
                                                 //if(dbg) log(content)
                                                 let contentNew = content.replace(re, newObjectPath);
                                                 //Backup des Originals
                                                 fs.writeFileSync(file + '.bak', content);
                                                 //Neue Datei mit geändertem Namespace
                                                 fs.writeFileSync(file + '.new', contentNew);
                                                 
                                                 // Mit Vorsicht nutzen!!!
                                                 /*if(restoreInSystem) {
                                                     writeFileAsync('vis.0', visPathSystem, contentNew);
                                                 }*/
                                             })
                                          }
                                          
                                          doIt();
                                          
                                          

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

                                            @fastfoot

                                            danke - das schaut doch sehr gut aus

                                            dieses script für sich wäre schon einen thread wert 🙂 hätte ich gut brauchen können als trashschedule die adapter-object-werte geändert hatte

                                            meine ersten test sehen sehr gut aus - vis und vis-editor zeigen alles richtig an

                                            • habe noch eine whitelist hinzugefügt - falls du dies anders "coden" würdest - einfach ändern - eine einschränkung ist besser beim testen und für den "tägl" gebrauch kann es auch sinnvoll sein, wenn man nur bestimmte vis-projekte ändern kann
                                            • habe auch das backup file unbenannt (datum-uhrzeit) -damit es nicht überschrieben wird
                                            • wenn direkt ins system geschrieben wird, braucht es eigentlich keine new datei

                                            /**
                                            * Zweck:   Ändert Namespace in VIS
                                            * Datum:   18.08.2021
                                            * Autor:   @fastfoot nach einer Vorlage von @liv-in-sky
                                            * Forum:   https://forum.iobroker.net/topic/47113/skript-namespace-für-datenpunkte-in-skripten-abändern/25
                                            */
                                            const fs = require('fs');
                                            const dbg = false;
                                            let visPath = "/opt/iobroker/iobroker-data/files/vis.0/";
                                            let oldObjectPath = "controll-own.0";
                                            let newObjectPath = "0_userdata.0.CONTROL-OWN";
                                            let whichProjectsToChange=["umstellung-test"];     // [] == all   // or add single projects
                                            const restoreInSystem = false;                     // Mit Vorsicht nutzen!!!
                                            let myVisFiles = [];
                                            let re = new RegExp(oldObjectPath, "g");
                                            
                                            function getFilesFromPath(path){
                                              let filesInPath = [];
                                              filesInPath = fs.readdirSync(path,'utf8');
                                              filesInPath.forEach(file => {
                                                  const filePath = path + '/' + file;
                                                  if(fs.statSync(filePath).isFile()) {
                                                      if(file === 'vis-views.json' || file === 'xxxvis-user.css')
                                                          myVisFiles.push(filePath);
                                                  } else{
                                                      //if(dbg) log(filePath);
                                                      getFilesFromPath(filePath);
                                                  }
                                              })
                                            }
                                            
                                            function doIt(){
                                              if(visPath.lastIndexOf('/') === visPath.length - 1) visPath = visPath.substring(0,visPath.lastIndexOf('/'));
                                              //füllt Array myVisFiles
                                              getFilesFromPath(visPath);
                                            
                                              myVisFiles.forEach(file => {
                                                  if(whichProjectsToChange.length==0 || whichProjectsToChange.toString().includes(file.split('/').slice(6,7).toString()) ) {
                                                  let visPathSystem = file.split('/').slice(6).join('/') ;
                                                  /*if(dbg)*/ log(visPathSystem); 
                                                  let content = fs.readFileSync(file, 'utf8');
                                                  //if(dbg) log(content)
                                                  let contentNew = content.replace(re, newObjectPath);
                                                  //Backup des Originals
                                                   fs.writeFileSync(file +"-"+formatDate(getDateObject((new Date().getTime())), "(SS:mm:ss)-(DD.MM.)")+ '.bak', content);
                                                  //Neue Datei mit geändertem Namespace
                                                  if(!restoreInSystem) fs.writeFileSync(file + '.new', contentNew);
                                                  
                                                  // Mit Vorsicht nutzen!!!
                                                  if(restoreInSystem) {
                                                       writeFileAsync('vis.0', visPathSystem, contentNew);  }
                                                  }
                                              })
                                            }
                                            
                                            doIt();
                                            
                                            
                                            
                                            
                                            
                                            
                                            
                                            

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            767
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            82
                                            4924
                                            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