Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Skript] Namespace für Datenpunkte in Skripten abändern

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
82 Beiträge 6 Kommentatoren 8.3k Aufrufe 9 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • F Offline
    F Offline
    fastfoot
    schrieb am zuletzt editiert von fastfoot
    #1

    Schon länger sind User angehalten, für ihre eigenen Datenpunkte den Namespace 0_userdata.0 zu verwenden. Mit Einführung von Admin 5 wird das auch mehr forciert und es wird so langsam Zeit 'umzuziehen', sprich, wer eigene Datenpunkte z.B. unter MeineDatenpunkte.0 angelegt hat sollte diese nun unter 0_userdata.0 anlegen. Da sich evtl. viele Skripte angesammelt haben, welche auf die alten DP Bezug nehmen und es sehr mühsam ist alle Skripte händisch anzupassen ist dieses Skript entstanden. Auch wer nicht konvertieren will oder muss kann so eine komplette Übersicht über seine Skripte erhalten.
    Was kann das Skript?

    • Auflistung aller Skripte mit Name und Pfad, Beschreibung(wenn Header gepflegt wird), Instanz, Typ, Anzahl der erforderlichen Änderungen, Status(läuft/läuft nicht)
      • Die Darstellung erfolgt durch einen mit JSON Daten gefüllten DP und einem JSON Widget von inventwo. Der dazu notwendige DP muss händisch angelegt werden!
    • Schreiben von notwendigen Änderungen als Datei in das Dateisystem, bei Blockly-Skripten als xml-Export. Unterstützt werden Javascript, Blockly und Typescript.
      • Diese Option ist einstellbar über writeToFileSystem (Default = true) und pathToRestore (Default = /opt/iobroker/switched)
    • Direktes Ändern der Skripte im System.
      • Auf Wunsch (und aus Sicherheitsgründen enpfohlen!!!) wird an den Skriptnamen die Endung Chg angehängt, hierbei wird dann eine Kopie erstellt und das Original bleibt erhalten. Ist die Endung auf '' gesetzt, wird das Original überschrieben.
      • Aktive Skripte werden nicht ins System übernommen.
      • Diese Option ist einstellbar über replaceInSystemsDB (Default = false) und extChanged (Default = Chg)
    • Einstellungen für das Verhalten des Skriptes erfolgen in den Zeilen 11-15

    Was das Skript nicht kann:

    • Notwendige Änderungen in der VIS müssen händisch erfolgen.
    • Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

    Unzulänglichkeiten:

    • Skripte, welche javascript.x.scriptEnabled zum Ein- und Auschalten von Skripten verwenden, werden evtl. nicht richtig/vollständig konvertiert
    • Skripte welche setState(myDP, wert) ohne Namespace verwenden(d.h. der State wird automatisch in javascript.instance.myDP geschrieben) werden nicht korrekt konvertiert

    Ich hoffe dass das Skript bei einer anstehenden Konvertierung hilfreich sein wird. Evtl. Korrekturen und Verbesserungen werden in diesem Beitrag gepostet

    /**
    * Zweck:           Ändert Namespace von Datenpunkten in Skripten
    * Datum:           20.08.2021
    * Author:          @fastfoot
    * Forum:           https://forum.iobroker.net/topic/47113/skript-namespace-f%C3%BCr-datenpunkte-in-skripten-abändern
    */
    let dbg = false;                        // Zusatzausgaben fürs Debugging
    const newNamespace = '0_userdata.0';      //neuer Namespace für DP
    
    //          Eigene Einstellungen
    const oldNamespace = 'oldNamespace.0';       //Ordner für Namespace welcher ersetzt wird
    const replaceInSystemsDB = false;// lädt geänderte Dateien sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
    const writeToFileSystem = true;// Geänderte Dateien ins Filesystem schreiben
    const pathToRestore = '/opt/iobroker/switched/'; // <=== Pfad eintragen mit abschliessendem /
    const extChanged = 'Chg';   // Wird im Falle einer Änderung an ID und Name angehangen
    
    let changes = 0; // Zählt Änderungen in einem Skript
    let changesResult = []; // Zussammenfassung der Ergebnisse, wird in DP geschrieben
    
    function switchDPs(){
       if(oldNamespace === newNamespace) return;
       if(!checkPath()) return;
       let scriptNo = 0;
       const scriptIds = $('javascript.*.scriptEnabled.*');        //NICHT abändern!!!
       scriptIds.each(scriptSearchId => {
           //if(dbg) log(scriptSearchId);
           let isRunning = getState(scriptSearchId).val ? 'Ja' : 'Nein';
           let scripPath = scriptSearchId.split('.').slice(3).join('.');
           let searchInstance = scriptSearchId.split('.')[1];
           let scriptId = 'script.js.' + scripPath;
           let scriptIdNew = scriptId + extChanged;
           let obj = getObject(scriptId);
           let data = '';
           let Zweck = ' ';
           changes = 0;
           if(obj && obj.type === 'script' && obj.common.source){
               //if(dbg) log(obj.common.name);
               let arr = obj.common.engine.split('.');
               let Instance = arr[arr.length - 1];
               if (searchInstance != Instance) return;
               scriptNo++;
               let fn = scripPath; // obj.common.name;
               let ext = '';
               let sourceNew = '';
               //obj.common.name += extChanged;
               switch(obj.common.engineType.toLowerCase()){
                   case 'blockly':
                       ext = '.xml';
                       if(/(Zweck|Purpose):\s+(.*)/.test(obj.common.source)){
                           Zweck = /(Zweck|Purpose):\s+(.*)/.exec(obj.common.source)[2];
                       }
                       let result = convertBlockly(obj.common.source);
                       sourceNew = result.source;
                       data = result.xml;
                       //if(dbg) log(result.xml)
                       break;
                   case 'javascript/js':
                       ext = '.js';
                       sourceNew = obj.common.source;
                       if(/(Zweck|Purpose):\s+(.*)/.test(sourceNew)){
                           Zweck = /(Zweck|Purpose):\s+(.*)/.exec(sourceNew)[2];
                       }
                       while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                           changes++;
                           sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                       }
                       data = sourceNew;
                       break;
                   case 'typescript/ts':
                       ext = '.ts';
                       sourceNew = obj.common.source;
                       while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                           changes++;
                           sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                       }
                       data = sourceNew;
                       break;
                   default:
                       ext = 'undef';
               }
               if(isRunning === 'Nein' && replaceInSystemsDB && changes > 0){
                   obj.common.name += extChanged;
                   obj.common.source = sourceNew;
                   setObject(scriptId + extChanged, obj);
               }
               if(writeToFileSystem && changes > 0){
                   fn += extChanged + ext;
                   let fnOut = pathToRestore + fn;
                   //if(dbg) log(fnOut);
                   require('fs').writeFile(fnOut, data, e => {
                       if(e) log('Fehler beim Schreiben der Datei: ' + e);
                   })
               }
               if(changes >= 0){
                   changesResult.push({
                       Nr: scriptNo,
                       Skript: fn,
                       Zweck: Zweck,
                       Instance: Instance,
                       Type: obj.common.engineType,
                       Changes: changes,
                       isRunning: isRunning
                   })
               }
           }
       })
       require('fs').writeFile(pathToRestore + 'scriptsFound.json', JSON.stringify(changesResult,null,4),e =>{
           if(e) log('Fehle beim Schreiben von Datei: ' + e);
       })
       changesResult.sort((a,b) => a.Skript.localeCompare(b.Skript));
       scriptNo = 1;
       changesResult.forEach(obj => {
           obj.Nr = scriptNo++;
       })
       if(existsState('0_userdata.0.scriptCheck')){
           setState('0_userdata.0.scriptCheck', JSON.stringify(changesResult));
       } else{
           log('Der DP 0_userdata.0.scriptCheck muss händisch angelegt werden!', 'error')
       }
    }
    /**
    * konvertiere Blockly Sourcecode
    * @param {string} source - base64 codierter Source
    * @returns {object} konvertierte Daten
    */
    function convertBlockly(source){
       let regex = new RegExp(oldNamespace, "g");
       let blocklyHeaderTmp = source.split('\n')
       blocklyHeaderTmp.pop();
       let blocklyHeader = blocklyHeaderTmp.join('\n').replace(regex, newNamespace) + '\n//'; 
       const pos = source.lastIndexOf('\n');
       if (pos !== -1) {
           let base64Str = source.substring(pos + 3);
           if(base64Str.indexOf('JTNDeG1sJTIweG1') > -1) {
               let xml = decodeURIComponent(Buffer.from(base64Str, 'base64').toString('utf8'));
               let xmlNew = convertJsFunction(xml);
               //if(dbg) log(xml);
               while(xmlNew.indexOf(oldNamespace) >= 0 && xmlNew.indexOf('.scriptEnabled.') == -1){
                   changes++;
                   xmlNew = xmlNew.replace(oldNamespace, newNamespace)
               }
               let sourceNew = blocklyHeader + Buffer.from(encodeURIComponent(xmlNew)).toString('base64');
               //if(dbg) log(sourceNew);
               return {source: sourceNew, xml: prettifyXml(xmlNew), changed: changes > 0};
           }
       }
    }
    /**
    * konvertiere Blockly JS-Funktion
    * @param {string} xml - blockly xml
    * @returns {string} konvertierte Daten
    */
    function convertJsFunction(xml) {
       let b64 = new RegExp(/(?:"SCRIPT">)([^<]+)(?:<\/field>)/g);
       let m;
       while ((m = b64.exec(xml)) !== null) {
           if (m.index === b64.lastIndex) b64.lastIndex++;
           let fnc = Buffer.from(m[1], 'base64').toString();
           while(fnc.indexOf(oldNamespace) >= 0){
               changes++;
               fnc = fnc.replace(oldNamespace, newNamespace);
           }
           fnc = Buffer.from(fnc).toString('base64');
           xml = xml.replace(m[1],fnc);
       }
       return xml;
    }
    
    //from Stackoverflow
    function prettifyXml(xml){
       var reg = /(>)\s*(<)(\/*)/g;
       xml = xml.replace(/\r|\n/g, ''); //deleting already existing whitespaces
       xml = xml.replace(reg, '$1\r\n$2$3');
       return xml;
    }
    
    function checkPath(){
       if(pathToRestore.lastIndexOf('/') != pathToRestore.length -1){
           log('Der Pfad in pathToRestore muss mit einem Slash(/) abschliessen!','error');
           return false;
       }
       if(!require('fs').existsSync(pathToRestore)){
           log('Der Pfad in pathToRestore(' + pathToRestore +') existiert nicht!','error');
           return false;
       }
       return true
    }
    
    switchDPs();
    
    



    {
    "settings": {
    "style": {
    "background_class": ""
    },
    "theme": "redmond",
    "sizex": "",
    "sizey": "",
    "gridSize": "10",
    "snapType": 2
    },
    "widgets": {
    "e00001": {
    "tpl": "i-vis-jsontable",
    "data": {
    "g_fixed": false,
    "g_visibility": false,
    "g_css_font_text": false,
    "g_css_background": false,
    "g_css_shadow_padding": false,
    "g_css_border": false,
    "g_gestures": false,
    "g_signals": false,
    "g_last_change": false,
    "visibility-cond": "==",
    "visibility-val": 1,
    "visibility-groups-action": "hide",
    "iTblRowLimit": "500",
    "iTableRefreshRate": "0",
    "iColCount": "7",
    "iColShow1": "true",
    "iTblTextAlign1": "center",
    "iTblCellFormat1": "normal",
    "iTblCellImageSize1": "200",
    "iTblCellBooleanCheckbox1": "false",
    "iTblCellBooleanColorFalse1": "#ff0000",
    "iTblCellBooleanColorTrue1": "#00ff00",
    "iTblCellNumberDecimals1": "2",
    "iTblCellNumberDecimalSeperator1": ".",
    "iTblCellNumberThousandSeperator1": ",",
    "iTblCellThresholdsDp1": "",
    "iTblCellThresholdsText1": "",
    "iOpacityAll": "1",
    "iTblRowEvenColor": "#333333",
    "iTblRowUnevenColor": "#455618",
    "iTblHeaderColor": "#333333",
    "iRowSpacing": "10",
    "iTblRowEvenTextColor": "#ffffff",
    "iTblRowUnevenTextColor": "#ffffff",
    "iTblHeaderTextColor": "#ffffff",
    "iBorderSize": "1",
    "iBorderStyleLeft": "solid",
    "iBorderStyleRight": "solid",
    "iBorderStyleUp": "solid",
    "iBorderStyleDown": "solid",
    "iBorderColor": "#ffffff",
    "signals-cond-0": "==",
    "signals-val-0": true,
    "signals-icon-0": "/vis/signals/lowbattery.png",
    "signals-icon-size-0": 0,
    "signals-blink-0": false,
    "signals-horz-0": 0,
    "signals-vert-0": 0,
    "signals-hide-edit-0": false,
    "signals-cond-1": "==",
    "signals-val-1": true,
    "signals-icon-1": "/vis/signals/lowbattery.png",
    "signals-icon-size-1": 0,
    "signals-blink-1": false,
    "signals-horz-1": 0,
    "signals-vert-1": 0,
    "signals-hide-edit-1": false,
    "signals-cond-2": "==",
    "signals-val-2": true,
    "signals-icon-2": "/vis/signals/lowbattery.png",
    "signals-icon-size-2": 0,
    "signals-blink-2": false,
    "signals-horz-2": 0,
    "signals-vert-2": 0,
    "signals-hide-edit-2": false,
    "lc-type": "last-change",
    "lc-is-interval": true,
    "lc-is-moment": false,
    "lc-format": "",
    "lc-position-vert": "top",
    "lc-position-horz": "right",
    "lc-offset-vert": 0,
    "lc-offset-horz": 0,
    "lc-font-size": "12px",
    "lc-font-family": "",
    "lc-font-style": "",
    "lc-bkg-color": "",
    "lc-color": "",
    "lc-border-width": "0",
    "lc-border-style": "",
    "lc-border-color": "",
    "lc-border-radius": 10,
    "lc-zindex": 0,
    "oid": "0_userdata.0.scriptCheck",
    "iTblShowHead": true,
    "iTblFixedHead": true,
    "iVertScroll": true,
    "iColShow2": "true",
    "iTblTextAlign2": "left",
    "iTblCellFormat2": "normal",
    "iTblCellImageSize2": "200",
    "iTblCellBooleanCheckbox2": "false",
    "iTblCellBooleanColorFalse2": "#ff0000",
    "iTblCellBooleanColorTrue2": "#00ff00",
    "iTblCellNumberDecimals2": "2",
    "iTblCellNumberDecimalSeperator2": ".",
    "iTblCellNumberThousandSeperator2": ",",
    "iTblCellThresholdsDp2": "",
    "iTblCellThresholdsText2": "",
    "iColShow3": "true",
    "iTblTextAlign3": "left",
    "iTblCellFormat3": "normal",
    "iTblCellImageSize3": "200",
    "iTblCellBooleanCheckbox3": "false",
    "iTblCellBooleanColorFalse3": "#ff0000",
    "iTblCellBooleanColorTrue3": "#00ff00",
    "iTblCellNumberDecimals3": "2",
    "iTblCellNumberDecimalSeperator3": ".",
    "iTblCellNumberThousandSeperator3": ",",
    "iTblCellThresholdsDp3": "",
    "iTblCellThresholdsText3": "",
    "iBorderRemoveDouble": true,
    "iColShow4": "true",
    "iTblTextAlign4": "center",
    "iTblCellFormat4": "normal",
    "iTblCellImageSize4": "200",
    "iTblCellBooleanCheckbox4": "false",
    "iTblCellBooleanColorFalse4": "#ff0000",
    "iTblCellBooleanColorTrue4": "#00ff00",
    "iTblCellNumberDecimals4": "2",
    "iTblCellNumberDecimalSeperator4": ".",
    "iTblCellNumberThousandSeperator4": ",",
    "iTblCellThresholdsDp4": "",
    "iTblCellThresholdsText4": "",
    "iColShow5": "true",
    "iTblTextAlign5": "left",
    "iTblCellFormat5": "normal",
    "iTblCellImageSize5": "200",
    "iTblCellBooleanCheckbox5": "false",
    "iTblCellBooleanColorFalse5": "#ff0000",
    "iTblCellBooleanColorTrue5": "#00ff00",
    "iTblCellNumberDecimals5": "2",
    "iTblCellNumberDecimalSeperator5": ".",
    "iTblCellNumberThousandSeperator5": ",",
    "iTblCellThresholdsDp5": "",
    "iTblCellThresholdsText5": "",
    "iColShow6": "true",
    "iTblTextAlign6": "right",
    "iTblCellFormat6": "normal",
    "iTblCellImageSize6": "200",
    "iTblCellBooleanCheckbox6": true,
    "iTblCellBooleanColorFalse6": "#ff0000",
    "iTblCellBooleanColorTrue6": "#00ff00",
    "iTblCellNumberDecimals6": "2",
    "iTblCellNumberDecimalSeperator6": ".",
    "iTblCellNumberThousandSeperator6": ",",
    "iTblCellThresholdsDp6": "",
    "iTblCellThresholdsText6": "",
    "iColShow7": "true",
    "iTblTextAlign7": "center",
    "iTblCellFormat7": "normal",
    "iTblCellImageSize7": "200",
    "iTblCellBooleanCheckbox7": "false",
    "iTblCellBooleanColorFalse7": "#ff0000",
    "iTblCellBooleanColorTrue7": "#00ff00",
    "iTblCellNumberDecimals7": "2",
    "iTblCellNumberDecimalSeperator7": ".",
    "iTblCellNumberThousandSeperator7": ",",
    "iTblCellThresholdsDp7": "",
    "iTblCellThresholdsText7": ""
    },
    "style": {
    "left": "10px",
    "top": "59px",
    "height": "716px",
    "width": "1273px"
    },
    "widgetSet": "vis-inventwo"
    }
    },
    "name": "scriptCheck",
    "filterList": []
    }

    SwitchDP.PNG

    iobroker läuft unter Docker auf QNAP TS-451+
    SkriptRecovery: https://forum.iobroker.net/post/930558

    F sigi234S liv-in-skyL S 5 Antworten Letzte Antwort
    3
    • F fastfoot

      Schon länger sind User angehalten, für ihre eigenen Datenpunkte den Namespace 0_userdata.0 zu verwenden. Mit Einführung von Admin 5 wird das auch mehr forciert und es wird so langsam Zeit 'umzuziehen', sprich, wer eigene Datenpunkte z.B. unter MeineDatenpunkte.0 angelegt hat sollte diese nun unter 0_userdata.0 anlegen. Da sich evtl. viele Skripte angesammelt haben, welche auf die alten DP Bezug nehmen und es sehr mühsam ist alle Skripte händisch anzupassen ist dieses Skript entstanden. Auch wer nicht konvertieren will oder muss kann so eine komplette Übersicht über seine Skripte erhalten.
      Was kann das Skript?

      • Auflistung aller Skripte mit Name und Pfad, Beschreibung(wenn Header gepflegt wird), Instanz, Typ, Anzahl der erforderlichen Änderungen, Status(läuft/läuft nicht)
        • Die Darstellung erfolgt durch einen mit JSON Daten gefüllten DP und einem JSON Widget von inventwo. Der dazu notwendige DP muss händisch angelegt werden!
      • Schreiben von notwendigen Änderungen als Datei in das Dateisystem, bei Blockly-Skripten als xml-Export. Unterstützt werden Javascript, Blockly und Typescript.
        • Diese Option ist einstellbar über writeToFileSystem (Default = true) und pathToRestore (Default = /opt/iobroker/switched)
      • Direktes Ändern der Skripte im System.
        • Auf Wunsch (und aus Sicherheitsgründen enpfohlen!!!) wird an den Skriptnamen die Endung Chg angehängt, hierbei wird dann eine Kopie erstellt und das Original bleibt erhalten. Ist die Endung auf '' gesetzt, wird das Original überschrieben.
        • Aktive Skripte werden nicht ins System übernommen.
        • Diese Option ist einstellbar über replaceInSystemsDB (Default = false) und extChanged (Default = Chg)
      • Einstellungen für das Verhalten des Skriptes erfolgen in den Zeilen 11-15

      Was das Skript nicht kann:

      • Notwendige Änderungen in der VIS müssen händisch erfolgen.
      • Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

      Unzulänglichkeiten:

      • Skripte, welche javascript.x.scriptEnabled zum Ein- und Auschalten von Skripten verwenden, werden evtl. nicht richtig/vollständig konvertiert
      • Skripte welche setState(myDP, wert) ohne Namespace verwenden(d.h. der State wird automatisch in javascript.instance.myDP geschrieben) werden nicht korrekt konvertiert

      Ich hoffe dass das Skript bei einer anstehenden Konvertierung hilfreich sein wird. Evtl. Korrekturen und Verbesserungen werden in diesem Beitrag gepostet

      /**
      * Zweck:           Ändert Namespace von Datenpunkten in Skripten
      * Datum:           20.08.2021
      * Author:          @fastfoot
      * Forum:           https://forum.iobroker.net/topic/47113/skript-namespace-f%C3%BCr-datenpunkte-in-skripten-abändern
      */
      let dbg = false;                        // Zusatzausgaben fürs Debugging
      const newNamespace = '0_userdata.0';      //neuer Namespace für DP
      
      //          Eigene Einstellungen
      const oldNamespace = 'oldNamespace.0';       //Ordner für Namespace welcher ersetzt wird
      const replaceInSystemsDB = false;// lädt geänderte Dateien sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
      const writeToFileSystem = true;// Geänderte Dateien ins Filesystem schreiben
      const pathToRestore = '/opt/iobroker/switched/'; // <=== Pfad eintragen mit abschliessendem /
      const extChanged = 'Chg';   // Wird im Falle einer Änderung an ID und Name angehangen
      
      let changes = 0; // Zählt Änderungen in einem Skript
      let changesResult = []; // Zussammenfassung der Ergebnisse, wird in DP geschrieben
      
      function switchDPs(){
         if(oldNamespace === newNamespace) return;
         if(!checkPath()) return;
         let scriptNo = 0;
         const scriptIds = $('javascript.*.scriptEnabled.*');        //NICHT abändern!!!
         scriptIds.each(scriptSearchId => {
             //if(dbg) log(scriptSearchId);
             let isRunning = getState(scriptSearchId).val ? 'Ja' : 'Nein';
             let scripPath = scriptSearchId.split('.').slice(3).join('.');
             let searchInstance = scriptSearchId.split('.')[1];
             let scriptId = 'script.js.' + scripPath;
             let scriptIdNew = scriptId + extChanged;
             let obj = getObject(scriptId);
             let data = '';
             let Zweck = ' ';
             changes = 0;
             if(obj && obj.type === 'script' && obj.common.source){
                 //if(dbg) log(obj.common.name);
                 let arr = obj.common.engine.split('.');
                 let Instance = arr[arr.length - 1];
                 if (searchInstance != Instance) return;
                 scriptNo++;
                 let fn = scripPath; // obj.common.name;
                 let ext = '';
                 let sourceNew = '';
                 //obj.common.name += extChanged;
                 switch(obj.common.engineType.toLowerCase()){
                     case 'blockly':
                         ext = '.xml';
                         if(/(Zweck|Purpose):\s+(.*)/.test(obj.common.source)){
                             Zweck = /(Zweck|Purpose):\s+(.*)/.exec(obj.common.source)[2];
                         }
                         let result = convertBlockly(obj.common.source);
                         sourceNew = result.source;
                         data = result.xml;
                         //if(dbg) log(result.xml)
                         break;
                     case 'javascript/js':
                         ext = '.js';
                         sourceNew = obj.common.source;
                         if(/(Zweck|Purpose):\s+(.*)/.test(sourceNew)){
                             Zweck = /(Zweck|Purpose):\s+(.*)/.exec(sourceNew)[2];
                         }
                         while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                             changes++;
                             sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                         }
                         data = sourceNew;
                         break;
                     case 'typescript/ts':
                         ext = '.ts';
                         sourceNew = obj.common.source;
                         while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                             changes++;
                             sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                         }
                         data = sourceNew;
                         break;
                     default:
                         ext = 'undef';
                 }
                 if(isRunning === 'Nein' && replaceInSystemsDB && changes > 0){
                     obj.common.name += extChanged;
                     obj.common.source = sourceNew;
                     setObject(scriptId + extChanged, obj);
                 }
                 if(writeToFileSystem && changes > 0){
                     fn += extChanged + ext;
                     let fnOut = pathToRestore + fn;
                     //if(dbg) log(fnOut);
                     require('fs').writeFile(fnOut, data, e => {
                         if(e) log('Fehler beim Schreiben der Datei: ' + e);
                     })
                 }
                 if(changes >= 0){
                     changesResult.push({
                         Nr: scriptNo,
                         Skript: fn,
                         Zweck: Zweck,
                         Instance: Instance,
                         Type: obj.common.engineType,
                         Changes: changes,
                         isRunning: isRunning
                     })
                 }
             }
         })
         require('fs').writeFile(pathToRestore + 'scriptsFound.json', JSON.stringify(changesResult,null,4),e =>{
             if(e) log('Fehle beim Schreiben von Datei: ' + e);
         })
         changesResult.sort((a,b) => a.Skript.localeCompare(b.Skript));
         scriptNo = 1;
         changesResult.forEach(obj => {
             obj.Nr = scriptNo++;
         })
         if(existsState('0_userdata.0.scriptCheck')){
             setState('0_userdata.0.scriptCheck', JSON.stringify(changesResult));
         } else{
             log('Der DP 0_userdata.0.scriptCheck muss händisch angelegt werden!', 'error')
         }
      }
      /**
      * konvertiere Blockly Sourcecode
      * @param {string} source - base64 codierter Source
      * @returns {object} konvertierte Daten
      */
      function convertBlockly(source){
         let regex = new RegExp(oldNamespace, "g");
         let blocklyHeaderTmp = source.split('\n')
         blocklyHeaderTmp.pop();
         let blocklyHeader = blocklyHeaderTmp.join('\n').replace(regex, newNamespace) + '\n//'; 
         const pos = source.lastIndexOf('\n');
         if (pos !== -1) {
             let base64Str = source.substring(pos + 3);
             if(base64Str.indexOf('JTNDeG1sJTIweG1') > -1) {
                 let xml = decodeURIComponent(Buffer.from(base64Str, 'base64').toString('utf8'));
                 let xmlNew = convertJsFunction(xml);
                 //if(dbg) log(xml);
                 while(xmlNew.indexOf(oldNamespace) >= 0 && xmlNew.indexOf('.scriptEnabled.') == -1){
                     changes++;
                     xmlNew = xmlNew.replace(oldNamespace, newNamespace)
                 }
                 let sourceNew = blocklyHeader + Buffer.from(encodeURIComponent(xmlNew)).toString('base64');
                 //if(dbg) log(sourceNew);
                 return {source: sourceNew, xml: prettifyXml(xmlNew), changed: changes > 0};
             }
         }
      }
      /**
      * konvertiere Blockly JS-Funktion
      * @param {string} xml - blockly xml
      * @returns {string} konvertierte Daten
      */
      function convertJsFunction(xml) {
         let b64 = new RegExp(/(?:"SCRIPT">)([^<]+)(?:<\/field>)/g);
         let m;
         while ((m = b64.exec(xml)) !== null) {
             if (m.index === b64.lastIndex) b64.lastIndex++;
             let fnc = Buffer.from(m[1], 'base64').toString();
             while(fnc.indexOf(oldNamespace) >= 0){
                 changes++;
                 fnc = fnc.replace(oldNamespace, newNamespace);
             }
             fnc = Buffer.from(fnc).toString('base64');
             xml = xml.replace(m[1],fnc);
         }
         return xml;
      }
      
      //from Stackoverflow
      function prettifyXml(xml){
         var reg = /(>)\s*(<)(\/*)/g;
         xml = xml.replace(/\r|\n/g, ''); //deleting already existing whitespaces
         xml = xml.replace(reg, '$1\r\n$2$3');
         return xml;
      }
      
      function checkPath(){
         if(pathToRestore.lastIndexOf('/') != pathToRestore.length -1){
             log('Der Pfad in pathToRestore muss mit einem Slash(/) abschliessen!','error');
             return false;
         }
         if(!require('fs').existsSync(pathToRestore)){
             log('Der Pfad in pathToRestore(' + pathToRestore +') existiert nicht!','error');
             return false;
         }
         return true
      }
      
      switchDPs();
      
      



      {
      "settings": {
      "style": {
      "background_class": ""
      },
      "theme": "redmond",
      "sizex": "",
      "sizey": "",
      "gridSize": "10",
      "snapType": 2
      },
      "widgets": {
      "e00001": {
      "tpl": "i-vis-jsontable",
      "data": {
      "g_fixed": false,
      "g_visibility": false,
      "g_css_font_text": false,
      "g_css_background": false,
      "g_css_shadow_padding": false,
      "g_css_border": false,
      "g_gestures": false,
      "g_signals": false,
      "g_last_change": false,
      "visibility-cond": "==",
      "visibility-val": 1,
      "visibility-groups-action": "hide",
      "iTblRowLimit": "500",
      "iTableRefreshRate": "0",
      "iColCount": "7",
      "iColShow1": "true",
      "iTblTextAlign1": "center",
      "iTblCellFormat1": "normal",
      "iTblCellImageSize1": "200",
      "iTblCellBooleanCheckbox1": "false",
      "iTblCellBooleanColorFalse1": "#ff0000",
      "iTblCellBooleanColorTrue1": "#00ff00",
      "iTblCellNumberDecimals1": "2",
      "iTblCellNumberDecimalSeperator1": ".",
      "iTblCellNumberThousandSeperator1": ",",
      "iTblCellThresholdsDp1": "",
      "iTblCellThresholdsText1": "",
      "iOpacityAll": "1",
      "iTblRowEvenColor": "#333333",
      "iTblRowUnevenColor": "#455618",
      "iTblHeaderColor": "#333333",
      "iRowSpacing": "10",
      "iTblRowEvenTextColor": "#ffffff",
      "iTblRowUnevenTextColor": "#ffffff",
      "iTblHeaderTextColor": "#ffffff",
      "iBorderSize": "1",
      "iBorderStyleLeft": "solid",
      "iBorderStyleRight": "solid",
      "iBorderStyleUp": "solid",
      "iBorderStyleDown": "solid",
      "iBorderColor": "#ffffff",
      "signals-cond-0": "==",
      "signals-val-0": true,
      "signals-icon-0": "/vis/signals/lowbattery.png",
      "signals-icon-size-0": 0,
      "signals-blink-0": false,
      "signals-horz-0": 0,
      "signals-vert-0": 0,
      "signals-hide-edit-0": false,
      "signals-cond-1": "==",
      "signals-val-1": true,
      "signals-icon-1": "/vis/signals/lowbattery.png",
      "signals-icon-size-1": 0,
      "signals-blink-1": false,
      "signals-horz-1": 0,
      "signals-vert-1": 0,
      "signals-hide-edit-1": false,
      "signals-cond-2": "==",
      "signals-val-2": true,
      "signals-icon-2": "/vis/signals/lowbattery.png",
      "signals-icon-size-2": 0,
      "signals-blink-2": false,
      "signals-horz-2": 0,
      "signals-vert-2": 0,
      "signals-hide-edit-2": false,
      "lc-type": "last-change",
      "lc-is-interval": true,
      "lc-is-moment": false,
      "lc-format": "",
      "lc-position-vert": "top",
      "lc-position-horz": "right",
      "lc-offset-vert": 0,
      "lc-offset-horz": 0,
      "lc-font-size": "12px",
      "lc-font-family": "",
      "lc-font-style": "",
      "lc-bkg-color": "",
      "lc-color": "",
      "lc-border-width": "0",
      "lc-border-style": "",
      "lc-border-color": "",
      "lc-border-radius": 10,
      "lc-zindex": 0,
      "oid": "0_userdata.0.scriptCheck",
      "iTblShowHead": true,
      "iTblFixedHead": true,
      "iVertScroll": true,
      "iColShow2": "true",
      "iTblTextAlign2": "left",
      "iTblCellFormat2": "normal",
      "iTblCellImageSize2": "200",
      "iTblCellBooleanCheckbox2": "false",
      "iTblCellBooleanColorFalse2": "#ff0000",
      "iTblCellBooleanColorTrue2": "#00ff00",
      "iTblCellNumberDecimals2": "2",
      "iTblCellNumberDecimalSeperator2": ".",
      "iTblCellNumberThousandSeperator2": ",",
      "iTblCellThresholdsDp2": "",
      "iTblCellThresholdsText2": "",
      "iColShow3": "true",
      "iTblTextAlign3": "left",
      "iTblCellFormat3": "normal",
      "iTblCellImageSize3": "200",
      "iTblCellBooleanCheckbox3": "false",
      "iTblCellBooleanColorFalse3": "#ff0000",
      "iTblCellBooleanColorTrue3": "#00ff00",
      "iTblCellNumberDecimals3": "2",
      "iTblCellNumberDecimalSeperator3": ".",
      "iTblCellNumberThousandSeperator3": ",",
      "iTblCellThresholdsDp3": "",
      "iTblCellThresholdsText3": "",
      "iBorderRemoveDouble": true,
      "iColShow4": "true",
      "iTblTextAlign4": "center",
      "iTblCellFormat4": "normal",
      "iTblCellImageSize4": "200",
      "iTblCellBooleanCheckbox4": "false",
      "iTblCellBooleanColorFalse4": "#ff0000",
      "iTblCellBooleanColorTrue4": "#00ff00",
      "iTblCellNumberDecimals4": "2",
      "iTblCellNumberDecimalSeperator4": ".",
      "iTblCellNumberThousandSeperator4": ",",
      "iTblCellThresholdsDp4": "",
      "iTblCellThresholdsText4": "",
      "iColShow5": "true",
      "iTblTextAlign5": "left",
      "iTblCellFormat5": "normal",
      "iTblCellImageSize5": "200",
      "iTblCellBooleanCheckbox5": "false",
      "iTblCellBooleanColorFalse5": "#ff0000",
      "iTblCellBooleanColorTrue5": "#00ff00",
      "iTblCellNumberDecimals5": "2",
      "iTblCellNumberDecimalSeperator5": ".",
      "iTblCellNumberThousandSeperator5": ",",
      "iTblCellThresholdsDp5": "",
      "iTblCellThresholdsText5": "",
      "iColShow6": "true",
      "iTblTextAlign6": "right",
      "iTblCellFormat6": "normal",
      "iTblCellImageSize6": "200",
      "iTblCellBooleanCheckbox6": true,
      "iTblCellBooleanColorFalse6": "#ff0000",
      "iTblCellBooleanColorTrue6": "#00ff00",
      "iTblCellNumberDecimals6": "2",
      "iTblCellNumberDecimalSeperator6": ".",
      "iTblCellNumberThousandSeperator6": ",",
      "iTblCellThresholdsDp6": "",
      "iTblCellThresholdsText6": "",
      "iColShow7": "true",
      "iTblTextAlign7": "center",
      "iTblCellFormat7": "normal",
      "iTblCellImageSize7": "200",
      "iTblCellBooleanCheckbox7": "false",
      "iTblCellBooleanColorFalse7": "#ff0000",
      "iTblCellBooleanColorTrue7": "#00ff00",
      "iTblCellNumberDecimals7": "2",
      "iTblCellNumberDecimalSeperator7": ".",
      "iTblCellNumberThousandSeperator7": ",",
      "iTblCellThresholdsDp7": "",
      "iTblCellThresholdsText7": ""
      },
      "style": {
      "left": "10px",
      "top": "59px",
      "height": "716px",
      "width": "1273px"
      },
      "widgetSet": "vis-inventwo"
      }
      },
      "name": "scriptCheck",
      "filterList": []
      }

      SwitchDP.PNG

      F Offline
      F Offline
      fastfoot
      schrieb am zuletzt editiert von fastfoot
      #2

      Kleine Ergänzung:

      • Vor dem Einsatz mit der Option replaceInSystemsDB unbedingt ein Backup machen!

      • Der in pathToRestore angegebene Pfad muss existieren!

      • Man kann die Suche bzw. Änderungen auf einzelne Ordner oder Skripte beschränken. Hierzu in Zeile 23 den Selektor abändern:

        • findet alle Skripte: const scriptIds = $('javascript.*.scriptEnabled.*');
        • Skripte in common: const scriptIds = $('javascript.*.scriptEnabled.common.*');
        • Einzelnes Skript: const scriptIds = $('javascript.*.scriptEnabled.*.convertMe');
      • Damit auch alle Skripte gefunden werden, die Instanz immer als * angeben, also javascript.*.

      iobroker läuft unter Docker auf QNAP TS-451+
      SkriptRecovery: https://forum.iobroker.net/post/930558

      1 Antwort Letzte Antwort
      0
      • F fastfoot

        Schon länger sind User angehalten, für ihre eigenen Datenpunkte den Namespace 0_userdata.0 zu verwenden. Mit Einführung von Admin 5 wird das auch mehr forciert und es wird so langsam Zeit 'umzuziehen', sprich, wer eigene Datenpunkte z.B. unter MeineDatenpunkte.0 angelegt hat sollte diese nun unter 0_userdata.0 anlegen. Da sich evtl. viele Skripte angesammelt haben, welche auf die alten DP Bezug nehmen und es sehr mühsam ist alle Skripte händisch anzupassen ist dieses Skript entstanden. Auch wer nicht konvertieren will oder muss kann so eine komplette Übersicht über seine Skripte erhalten.
        Was kann das Skript?

        • Auflistung aller Skripte mit Name und Pfad, Beschreibung(wenn Header gepflegt wird), Instanz, Typ, Anzahl der erforderlichen Änderungen, Status(läuft/läuft nicht)
          • Die Darstellung erfolgt durch einen mit JSON Daten gefüllten DP und einem JSON Widget von inventwo. Der dazu notwendige DP muss händisch angelegt werden!
        • Schreiben von notwendigen Änderungen als Datei in das Dateisystem, bei Blockly-Skripten als xml-Export. Unterstützt werden Javascript, Blockly und Typescript.
          • Diese Option ist einstellbar über writeToFileSystem (Default = true) und pathToRestore (Default = /opt/iobroker/switched)
        • Direktes Ändern der Skripte im System.
          • Auf Wunsch (und aus Sicherheitsgründen enpfohlen!!!) wird an den Skriptnamen die Endung Chg angehängt, hierbei wird dann eine Kopie erstellt und das Original bleibt erhalten. Ist die Endung auf '' gesetzt, wird das Original überschrieben.
          • Aktive Skripte werden nicht ins System übernommen.
          • Diese Option ist einstellbar über replaceInSystemsDB (Default = false) und extChanged (Default = Chg)
        • Einstellungen für das Verhalten des Skriptes erfolgen in den Zeilen 11-15

        Was das Skript nicht kann:

        • Notwendige Änderungen in der VIS müssen händisch erfolgen.
        • Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

        Unzulänglichkeiten:

        • Skripte, welche javascript.x.scriptEnabled zum Ein- und Auschalten von Skripten verwenden, werden evtl. nicht richtig/vollständig konvertiert
        • Skripte welche setState(myDP, wert) ohne Namespace verwenden(d.h. der State wird automatisch in javascript.instance.myDP geschrieben) werden nicht korrekt konvertiert

        Ich hoffe dass das Skript bei einer anstehenden Konvertierung hilfreich sein wird. Evtl. Korrekturen und Verbesserungen werden in diesem Beitrag gepostet

        /**
        * Zweck:           Ändert Namespace von Datenpunkten in Skripten
        * Datum:           20.08.2021
        * Author:          @fastfoot
        * Forum:           https://forum.iobroker.net/topic/47113/skript-namespace-f%C3%BCr-datenpunkte-in-skripten-abändern
        */
        let dbg = false;                        // Zusatzausgaben fürs Debugging
        const newNamespace = '0_userdata.0';      //neuer Namespace für DP
        
        //          Eigene Einstellungen
        const oldNamespace = 'oldNamespace.0';       //Ordner für Namespace welcher ersetzt wird
        const replaceInSystemsDB = false;// lädt geänderte Dateien sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
        const writeToFileSystem = true;// Geänderte Dateien ins Filesystem schreiben
        const pathToRestore = '/opt/iobroker/switched/'; // <=== Pfad eintragen mit abschliessendem /
        const extChanged = 'Chg';   // Wird im Falle einer Änderung an ID und Name angehangen
        
        let changes = 0; // Zählt Änderungen in einem Skript
        let changesResult = []; // Zussammenfassung der Ergebnisse, wird in DP geschrieben
        
        function switchDPs(){
           if(oldNamespace === newNamespace) return;
           if(!checkPath()) return;
           let scriptNo = 0;
           const scriptIds = $('javascript.*.scriptEnabled.*');        //NICHT abändern!!!
           scriptIds.each(scriptSearchId => {
               //if(dbg) log(scriptSearchId);
               let isRunning = getState(scriptSearchId).val ? 'Ja' : 'Nein';
               let scripPath = scriptSearchId.split('.').slice(3).join('.');
               let searchInstance = scriptSearchId.split('.')[1];
               let scriptId = 'script.js.' + scripPath;
               let scriptIdNew = scriptId + extChanged;
               let obj = getObject(scriptId);
               let data = '';
               let Zweck = ' ';
               changes = 0;
               if(obj && obj.type === 'script' && obj.common.source){
                   //if(dbg) log(obj.common.name);
                   let arr = obj.common.engine.split('.');
                   let Instance = arr[arr.length - 1];
                   if (searchInstance != Instance) return;
                   scriptNo++;
                   let fn = scripPath; // obj.common.name;
                   let ext = '';
                   let sourceNew = '';
                   //obj.common.name += extChanged;
                   switch(obj.common.engineType.toLowerCase()){
                       case 'blockly':
                           ext = '.xml';
                           if(/(Zweck|Purpose):\s+(.*)/.test(obj.common.source)){
                               Zweck = /(Zweck|Purpose):\s+(.*)/.exec(obj.common.source)[2];
                           }
                           let result = convertBlockly(obj.common.source);
                           sourceNew = result.source;
                           data = result.xml;
                           //if(dbg) log(result.xml)
                           break;
                       case 'javascript/js':
                           ext = '.js';
                           sourceNew = obj.common.source;
                           if(/(Zweck|Purpose):\s+(.*)/.test(sourceNew)){
                               Zweck = /(Zweck|Purpose):\s+(.*)/.exec(sourceNew)[2];
                           }
                           while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                               changes++;
                               sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                           }
                           data = sourceNew;
                           break;
                       case 'typescript/ts':
                           ext = '.ts';
                           sourceNew = obj.common.source;
                           while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                               changes++;
                               sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                           }
                           data = sourceNew;
                           break;
                       default:
                           ext = 'undef';
                   }
                   if(isRunning === 'Nein' && replaceInSystemsDB && changes > 0){
                       obj.common.name += extChanged;
                       obj.common.source = sourceNew;
                       setObject(scriptId + extChanged, obj);
                   }
                   if(writeToFileSystem && changes > 0){
                       fn += extChanged + ext;
                       let fnOut = pathToRestore + fn;
                       //if(dbg) log(fnOut);
                       require('fs').writeFile(fnOut, data, e => {
                           if(e) log('Fehler beim Schreiben der Datei: ' + e);
                       })
                   }
                   if(changes >= 0){
                       changesResult.push({
                           Nr: scriptNo,
                           Skript: fn,
                           Zweck: Zweck,
                           Instance: Instance,
                           Type: obj.common.engineType,
                           Changes: changes,
                           isRunning: isRunning
                       })
                   }
               }
           })
           require('fs').writeFile(pathToRestore + 'scriptsFound.json', JSON.stringify(changesResult,null,4),e =>{
               if(e) log('Fehle beim Schreiben von Datei: ' + e);
           })
           changesResult.sort((a,b) => a.Skript.localeCompare(b.Skript));
           scriptNo = 1;
           changesResult.forEach(obj => {
               obj.Nr = scriptNo++;
           })
           if(existsState('0_userdata.0.scriptCheck')){
               setState('0_userdata.0.scriptCheck', JSON.stringify(changesResult));
           } else{
               log('Der DP 0_userdata.0.scriptCheck muss händisch angelegt werden!', 'error')
           }
        }
        /**
        * konvertiere Blockly Sourcecode
        * @param {string} source - base64 codierter Source
        * @returns {object} konvertierte Daten
        */
        function convertBlockly(source){
           let regex = new RegExp(oldNamespace, "g");
           let blocklyHeaderTmp = source.split('\n')
           blocklyHeaderTmp.pop();
           let blocklyHeader = blocklyHeaderTmp.join('\n').replace(regex, newNamespace) + '\n//'; 
           const pos = source.lastIndexOf('\n');
           if (pos !== -1) {
               let base64Str = source.substring(pos + 3);
               if(base64Str.indexOf('JTNDeG1sJTIweG1') > -1) {
                   let xml = decodeURIComponent(Buffer.from(base64Str, 'base64').toString('utf8'));
                   let xmlNew = convertJsFunction(xml);
                   //if(dbg) log(xml);
                   while(xmlNew.indexOf(oldNamespace) >= 0 && xmlNew.indexOf('.scriptEnabled.') == -1){
                       changes++;
                       xmlNew = xmlNew.replace(oldNamespace, newNamespace)
                   }
                   let sourceNew = blocklyHeader + Buffer.from(encodeURIComponent(xmlNew)).toString('base64');
                   //if(dbg) log(sourceNew);
                   return {source: sourceNew, xml: prettifyXml(xmlNew), changed: changes > 0};
               }
           }
        }
        /**
        * konvertiere Blockly JS-Funktion
        * @param {string} xml - blockly xml
        * @returns {string} konvertierte Daten
        */
        function convertJsFunction(xml) {
           let b64 = new RegExp(/(?:"SCRIPT">)([^<]+)(?:<\/field>)/g);
           let m;
           while ((m = b64.exec(xml)) !== null) {
               if (m.index === b64.lastIndex) b64.lastIndex++;
               let fnc = Buffer.from(m[1], 'base64').toString();
               while(fnc.indexOf(oldNamespace) >= 0){
                   changes++;
                   fnc = fnc.replace(oldNamespace, newNamespace);
               }
               fnc = Buffer.from(fnc).toString('base64');
               xml = xml.replace(m[1],fnc);
           }
           return xml;
        }
        
        //from Stackoverflow
        function prettifyXml(xml){
           var reg = /(>)\s*(<)(\/*)/g;
           xml = xml.replace(/\r|\n/g, ''); //deleting already existing whitespaces
           xml = xml.replace(reg, '$1\r\n$2$3');
           return xml;
        }
        
        function checkPath(){
           if(pathToRestore.lastIndexOf('/') != pathToRestore.length -1){
               log('Der Pfad in pathToRestore muss mit einem Slash(/) abschliessen!','error');
               return false;
           }
           if(!require('fs').existsSync(pathToRestore)){
               log('Der Pfad in pathToRestore(' + pathToRestore +') existiert nicht!','error');
               return false;
           }
           return true
        }
        
        switchDPs();
        
        



        {
        "settings": {
        "style": {
        "background_class": ""
        },
        "theme": "redmond",
        "sizex": "",
        "sizey": "",
        "gridSize": "10",
        "snapType": 2
        },
        "widgets": {
        "e00001": {
        "tpl": "i-vis-jsontable",
        "data": {
        "g_fixed": false,
        "g_visibility": false,
        "g_css_font_text": false,
        "g_css_background": false,
        "g_css_shadow_padding": false,
        "g_css_border": false,
        "g_gestures": false,
        "g_signals": false,
        "g_last_change": false,
        "visibility-cond": "==",
        "visibility-val": 1,
        "visibility-groups-action": "hide",
        "iTblRowLimit": "500",
        "iTableRefreshRate": "0",
        "iColCount": "7",
        "iColShow1": "true",
        "iTblTextAlign1": "center",
        "iTblCellFormat1": "normal",
        "iTblCellImageSize1": "200",
        "iTblCellBooleanCheckbox1": "false",
        "iTblCellBooleanColorFalse1": "#ff0000",
        "iTblCellBooleanColorTrue1": "#00ff00",
        "iTblCellNumberDecimals1": "2",
        "iTblCellNumberDecimalSeperator1": ".",
        "iTblCellNumberThousandSeperator1": ",",
        "iTblCellThresholdsDp1": "",
        "iTblCellThresholdsText1": "",
        "iOpacityAll": "1",
        "iTblRowEvenColor": "#333333",
        "iTblRowUnevenColor": "#455618",
        "iTblHeaderColor": "#333333",
        "iRowSpacing": "10",
        "iTblRowEvenTextColor": "#ffffff",
        "iTblRowUnevenTextColor": "#ffffff",
        "iTblHeaderTextColor": "#ffffff",
        "iBorderSize": "1",
        "iBorderStyleLeft": "solid",
        "iBorderStyleRight": "solid",
        "iBorderStyleUp": "solid",
        "iBorderStyleDown": "solid",
        "iBorderColor": "#ffffff",
        "signals-cond-0": "==",
        "signals-val-0": true,
        "signals-icon-0": "/vis/signals/lowbattery.png",
        "signals-icon-size-0": 0,
        "signals-blink-0": false,
        "signals-horz-0": 0,
        "signals-vert-0": 0,
        "signals-hide-edit-0": false,
        "signals-cond-1": "==",
        "signals-val-1": true,
        "signals-icon-1": "/vis/signals/lowbattery.png",
        "signals-icon-size-1": 0,
        "signals-blink-1": false,
        "signals-horz-1": 0,
        "signals-vert-1": 0,
        "signals-hide-edit-1": false,
        "signals-cond-2": "==",
        "signals-val-2": true,
        "signals-icon-2": "/vis/signals/lowbattery.png",
        "signals-icon-size-2": 0,
        "signals-blink-2": false,
        "signals-horz-2": 0,
        "signals-vert-2": 0,
        "signals-hide-edit-2": false,
        "lc-type": "last-change",
        "lc-is-interval": true,
        "lc-is-moment": false,
        "lc-format": "",
        "lc-position-vert": "top",
        "lc-position-horz": "right",
        "lc-offset-vert": 0,
        "lc-offset-horz": 0,
        "lc-font-size": "12px",
        "lc-font-family": "",
        "lc-font-style": "",
        "lc-bkg-color": "",
        "lc-color": "",
        "lc-border-width": "0",
        "lc-border-style": "",
        "lc-border-color": "",
        "lc-border-radius": 10,
        "lc-zindex": 0,
        "oid": "0_userdata.0.scriptCheck",
        "iTblShowHead": true,
        "iTblFixedHead": true,
        "iVertScroll": true,
        "iColShow2": "true",
        "iTblTextAlign2": "left",
        "iTblCellFormat2": "normal",
        "iTblCellImageSize2": "200",
        "iTblCellBooleanCheckbox2": "false",
        "iTblCellBooleanColorFalse2": "#ff0000",
        "iTblCellBooleanColorTrue2": "#00ff00",
        "iTblCellNumberDecimals2": "2",
        "iTblCellNumberDecimalSeperator2": ".",
        "iTblCellNumberThousandSeperator2": ",",
        "iTblCellThresholdsDp2": "",
        "iTblCellThresholdsText2": "",
        "iColShow3": "true",
        "iTblTextAlign3": "left",
        "iTblCellFormat3": "normal",
        "iTblCellImageSize3": "200",
        "iTblCellBooleanCheckbox3": "false",
        "iTblCellBooleanColorFalse3": "#ff0000",
        "iTblCellBooleanColorTrue3": "#00ff00",
        "iTblCellNumberDecimals3": "2",
        "iTblCellNumberDecimalSeperator3": ".",
        "iTblCellNumberThousandSeperator3": ",",
        "iTblCellThresholdsDp3": "",
        "iTblCellThresholdsText3": "",
        "iBorderRemoveDouble": true,
        "iColShow4": "true",
        "iTblTextAlign4": "center",
        "iTblCellFormat4": "normal",
        "iTblCellImageSize4": "200",
        "iTblCellBooleanCheckbox4": "false",
        "iTblCellBooleanColorFalse4": "#ff0000",
        "iTblCellBooleanColorTrue4": "#00ff00",
        "iTblCellNumberDecimals4": "2",
        "iTblCellNumberDecimalSeperator4": ".",
        "iTblCellNumberThousandSeperator4": ",",
        "iTblCellThresholdsDp4": "",
        "iTblCellThresholdsText4": "",
        "iColShow5": "true",
        "iTblTextAlign5": "left",
        "iTblCellFormat5": "normal",
        "iTblCellImageSize5": "200",
        "iTblCellBooleanCheckbox5": "false",
        "iTblCellBooleanColorFalse5": "#ff0000",
        "iTblCellBooleanColorTrue5": "#00ff00",
        "iTblCellNumberDecimals5": "2",
        "iTblCellNumberDecimalSeperator5": ".",
        "iTblCellNumberThousandSeperator5": ",",
        "iTblCellThresholdsDp5": "",
        "iTblCellThresholdsText5": "",
        "iColShow6": "true",
        "iTblTextAlign6": "right",
        "iTblCellFormat6": "normal",
        "iTblCellImageSize6": "200",
        "iTblCellBooleanCheckbox6": true,
        "iTblCellBooleanColorFalse6": "#ff0000",
        "iTblCellBooleanColorTrue6": "#00ff00",
        "iTblCellNumberDecimals6": "2",
        "iTblCellNumberDecimalSeperator6": ".",
        "iTblCellNumberThousandSeperator6": ",",
        "iTblCellThresholdsDp6": "",
        "iTblCellThresholdsText6": "",
        "iColShow7": "true",
        "iTblTextAlign7": "center",
        "iTblCellFormat7": "normal",
        "iTblCellImageSize7": "200",
        "iTblCellBooleanCheckbox7": "false",
        "iTblCellBooleanColorFalse7": "#ff0000",
        "iTblCellBooleanColorTrue7": "#00ff00",
        "iTblCellNumberDecimals7": "2",
        "iTblCellNumberDecimalSeperator7": ".",
        "iTblCellNumberThousandSeperator7": ",",
        "iTblCellThresholdsDp7": "",
        "iTblCellThresholdsText7": ""
        },
        "style": {
        "left": "10px",
        "top": "59px",
        "height": "716px",
        "width": "1273px"
        },
        "widgetSet": "vis-inventwo"
        }
        },
        "name": "scriptCheck",
        "filterList": []
        }

        SwitchDP.PNG

        sigi234S Online
        sigi234S Online
        sigi234
        Forum Testing Most Active
        schrieb am zuletzt editiert von sigi234
        #3

        @fastfoot

        00:26:37.099	info	javascript.0 (16560) Stop script script.js.Sigi.Namespace
        00:26:37.107	info	javascript.0 (16560) Start javascript script.js.Sigi.Namespace
        00:26:37.123	info	javascript.0 (16560) script.js.Sigi.Namespace: registered 0 subscriptions and 0 schedules
        00:26:37.124	error	javascript.0 (16560) script.js.Sigi.Namespace: ReferenceError: Cannot access 'scriptId' before initialization
        00:26:37.124	error	javascript.0 (16560) at script.js.Sigi.Namespace:26:20
        00:26:37.124	error	javascript.0 (16560) at switchDPs (script.js.Sigi.Namespace:25:14)
        00:26:37.124	error	javascript.0 (16560) at script.js.Sigi.Namespace:186:1
        00:26:37.124	error	javascript.0 (16560) at script.js.Sigi.Namespace:189:3
        

        Screenshot (4170).png

        Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
        Immer Daten sichern!

        F 1 Antwort Letzte Antwort
        0
        • sigi234S sigi234

          @fastfoot

          00:26:37.099	info	javascript.0 (16560) Stop script script.js.Sigi.Namespace
          00:26:37.107	info	javascript.0 (16560) Start javascript script.js.Sigi.Namespace
          00:26:37.123	info	javascript.0 (16560) script.js.Sigi.Namespace: registered 0 subscriptions and 0 schedules
          00:26:37.124	error	javascript.0 (16560) script.js.Sigi.Namespace: ReferenceError: Cannot access 'scriptId' before initialization
          00:26:37.124	error	javascript.0 (16560) at script.js.Sigi.Namespace:26:20
          00:26:37.124	error	javascript.0 (16560) at switchDPs (script.js.Sigi.Namespace:25:14)
          00:26:37.124	error	javascript.0 (16560) at script.js.Sigi.Namespace:186:1
          00:26:37.124	error	javascript.0 (16560) at script.js.Sigi.Namespace:189:3
          

          Screenshot (4170).png

          F Offline
          F Offline
          fastfoot
          schrieb am zuletzt editiert von
          #4

          @sigi234 Der Fehler lag in Zeile 26(nach 'Verbesserung' von Variablennamen. Setze dennoch dbg auf false, da wird sehr viel Müll geloggt

          Du hast den Namespace in Zeile 11 nicht geändert, das wird dir keine Änderungen zeigen, ist aber für die Auflistung deiner Skripte völlig ok

          iobroker läuft unter Docker auf QNAP TS-451+
          SkriptRecovery: https://forum.iobroker.net/post/930558

          sigi234S 1 Antwort Letzte Antwort
          0
          • F fastfoot

            @sigi234 Der Fehler lag in Zeile 26(nach 'Verbesserung' von Variablennamen. Setze dennoch dbg auf false, da wird sehr viel Müll geloggt

            Du hast den Namespace in Zeile 11 nicht geändert, das wird dir keine Änderungen zeigen, ist aber für die Auflistung deiner Skripte völlig ok

            sigi234S Online
            sigi234S Online
            sigi234
            Forum Testing Most Active
            schrieb am zuletzt editiert von sigi234
            #5

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

            @sigi234 Der Fehler lag in Zeile 26(nach 'Verbesserung' von Variablennamen. Setze dennoch dbg auf false, da wird sehr viel Müll geloggt

            Du hast den Namespace in Zeile 11 nicht geändert, das wird dir keine Änderungen zeigen, ist aber für die Auflistung deiner Skripte völlig ok

            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?

            Info:
            Tabelle wird Richtig im Verzeichnis angelegt.

            LOG:

            javascript.0
            2021-08-18 08:35:56.416	info	script.js.Sigi.Namespace1: registered 0 subscriptions and 0 schedules
            
            javascript.0
            2021-08-18 08:35:56.415	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.415	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.415	warn	at switchDPs (script.js.Sigi.Namespace1:116:8)
            
            javascript.0
            2021-08-18 08:35:56.415	warn	at setState (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:1439:20)
            
            javascript.0
            2021-08-18 08:35:56.414	warn	You are assigning a array to the state "0_userdata.0.scriptCheck" which expects a string. Please fix your code to use a string or change the state type to array. This warning might become an error in future versions.
            
            javascript.0
            2021-08-18 08:35:56.410	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.410	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.410	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.409	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.409	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.409	warn	getState "javascript.0.scriptEnabled.global.messages" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.409	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.408	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.408	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.408	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.408	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.407	warn	getState "javascript.0.scriptEnabled.global.linkeddevices.linkeddevices0" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.407	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.407	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.406	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.406	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.406	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.405	warn	getState "javascript.0.scriptEnabled.global.function_event" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.405	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.405	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.405	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.405	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.405	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.404	warn	getState "javascript.0.scriptEnabled.global.Skript_1" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.404	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.404	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.404	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.404	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.404	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.403	warn	getState "javascript.0.scriptEnabled.global.Material_sendTo" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.400	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.400	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.400	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.400	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.400	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.399	warn	getState "javascript.0.scriptEnabled.global.MaterialDesignWidgets.vis-materialdesign0" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.399	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.399	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.399	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.398	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.398	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:56.397	warn	getState "javascript.0.scriptEnabled.global.Datum_holen" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:56.001	warn	at script.js.Sigi.Namespace1:189:3
            
            javascript.0
            2021-08-18 08:35:56.001	warn	at script.js.Sigi.Namespace1:186:1
            
            javascript.0
            2021-08-18 08:35:56.001	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
            
            javascript.0
            2021-08-18 08:35:56.001	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
            
            javascript.0
            2021-08-18 08:35:56.001	warn	at script.js.Sigi.Namespace1:27:24
            
            javascript.0
            2021-08-18 08:35:55.998	warn	getState "javascript.0.scriptEnabled.Rules.Skript_1" not found (3) states[id]=null
            
            javascript.0
            2021-08-18 08:35:55.208	info	Start javascript script.js.Sigi.Namespace1
            
            javascript.0
            2021-08-18 08:35:54.862	info	Stop script script.js.Sigi.Namespace1
            

            Konfig:

            /**
            * Zweck:           Ändert Namespace von Datenpunkten in Skripten
            * Datum:           17.08.2021
            * Author:          @fastfoot
            * Forum:           https://forum.iobroker.net/topic/47113/skript-namespace-f%C3%BCr-datenpunkte-in-skripten-abändern
            */
            let dbg = false;                        // Zusatzausgaben fürs Debugging
            const newNamespace = '0_userdata.0';      //neuer Namespace für DP
             
            //          Eigene Einstellungen
            const oldNamespace = '0_userdata.0.oldNamespace';       //Ordner für Namespace welcher ersetzt wird
            const replaceInSystemsDB = false;// lädt geänderte Dateien sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
            const writeToFileSystem = true;// Geänderte Dateien ins Filesystem schreiben
            const pathToRestore = 'C:/Program Files/iobroker/Home/backups/switched/'; // <=== Pfad eintragen mit abschliessendem /
            const extChanged = 'Chg';   // Wird im Falle einer Änderung an ID und Name angehangen
             
            

            Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
            Immer Daten sichern!

            F 1 Antwort Letzte Antwort
            0
            • F fastfoot

              Schon länger sind User angehalten, für ihre eigenen Datenpunkte den Namespace 0_userdata.0 zu verwenden. Mit Einführung von Admin 5 wird das auch mehr forciert und es wird so langsam Zeit 'umzuziehen', sprich, wer eigene Datenpunkte z.B. unter MeineDatenpunkte.0 angelegt hat sollte diese nun unter 0_userdata.0 anlegen. Da sich evtl. viele Skripte angesammelt haben, welche auf die alten DP Bezug nehmen und es sehr mühsam ist alle Skripte händisch anzupassen ist dieses Skript entstanden. Auch wer nicht konvertieren will oder muss kann so eine komplette Übersicht über seine Skripte erhalten.
              Was kann das Skript?

              • Auflistung aller Skripte mit Name und Pfad, Beschreibung(wenn Header gepflegt wird), Instanz, Typ, Anzahl der erforderlichen Änderungen, Status(läuft/läuft nicht)
                • Die Darstellung erfolgt durch einen mit JSON Daten gefüllten DP und einem JSON Widget von inventwo. Der dazu notwendige DP muss händisch angelegt werden!
              • Schreiben von notwendigen Änderungen als Datei in das Dateisystem, bei Blockly-Skripten als xml-Export. Unterstützt werden Javascript, Blockly und Typescript.
                • Diese Option ist einstellbar über writeToFileSystem (Default = true) und pathToRestore (Default = /opt/iobroker/switched)
              • Direktes Ändern der Skripte im System.
                • Auf Wunsch (und aus Sicherheitsgründen enpfohlen!!!) wird an den Skriptnamen die Endung Chg angehängt, hierbei wird dann eine Kopie erstellt und das Original bleibt erhalten. Ist die Endung auf '' gesetzt, wird das Original überschrieben.
                • Aktive Skripte werden nicht ins System übernommen.
                • Diese Option ist einstellbar über replaceInSystemsDB (Default = false) und extChanged (Default = Chg)
              • Einstellungen für das Verhalten des Skriptes erfolgen in den Zeilen 11-15

              Was das Skript nicht kann:

              • Notwendige Änderungen in der VIS müssen händisch erfolgen.
              • Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

              Unzulänglichkeiten:

              • Skripte, welche javascript.x.scriptEnabled zum Ein- und Auschalten von Skripten verwenden, werden evtl. nicht richtig/vollständig konvertiert
              • Skripte welche setState(myDP, wert) ohne Namespace verwenden(d.h. der State wird automatisch in javascript.instance.myDP geschrieben) werden nicht korrekt konvertiert

              Ich hoffe dass das Skript bei einer anstehenden Konvertierung hilfreich sein wird. Evtl. Korrekturen und Verbesserungen werden in diesem Beitrag gepostet

              /**
              * Zweck:           Ändert Namespace von Datenpunkten in Skripten
              * Datum:           20.08.2021
              * Author:          @fastfoot
              * Forum:           https://forum.iobroker.net/topic/47113/skript-namespace-f%C3%BCr-datenpunkte-in-skripten-abändern
              */
              let dbg = false;                        // Zusatzausgaben fürs Debugging
              const newNamespace = '0_userdata.0';      //neuer Namespace für DP
              
              //          Eigene Einstellungen
              const oldNamespace = 'oldNamespace.0';       //Ordner für Namespace welcher ersetzt wird
              const replaceInSystemsDB = false;// lädt geänderte Dateien sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
              const writeToFileSystem = true;// Geänderte Dateien ins Filesystem schreiben
              const pathToRestore = '/opt/iobroker/switched/'; // <=== Pfad eintragen mit abschliessendem /
              const extChanged = 'Chg';   // Wird im Falle einer Änderung an ID und Name angehangen
              
              let changes = 0; // Zählt Änderungen in einem Skript
              let changesResult = []; // Zussammenfassung der Ergebnisse, wird in DP geschrieben
              
              function switchDPs(){
                 if(oldNamespace === newNamespace) return;
                 if(!checkPath()) return;
                 let scriptNo = 0;
                 const scriptIds = $('javascript.*.scriptEnabled.*');        //NICHT abändern!!!
                 scriptIds.each(scriptSearchId => {
                     //if(dbg) log(scriptSearchId);
                     let isRunning = getState(scriptSearchId).val ? 'Ja' : 'Nein';
                     let scripPath = scriptSearchId.split('.').slice(3).join('.');
                     let searchInstance = scriptSearchId.split('.')[1];
                     let scriptId = 'script.js.' + scripPath;
                     let scriptIdNew = scriptId + extChanged;
                     let obj = getObject(scriptId);
                     let data = '';
                     let Zweck = ' ';
                     changes = 0;
                     if(obj && obj.type === 'script' && obj.common.source){
                         //if(dbg) log(obj.common.name);
                         let arr = obj.common.engine.split('.');
                         let Instance = arr[arr.length - 1];
                         if (searchInstance != Instance) return;
                         scriptNo++;
                         let fn = scripPath; // obj.common.name;
                         let ext = '';
                         let sourceNew = '';
                         //obj.common.name += extChanged;
                         switch(obj.common.engineType.toLowerCase()){
                             case 'blockly':
                                 ext = '.xml';
                                 if(/(Zweck|Purpose):\s+(.*)/.test(obj.common.source)){
                                     Zweck = /(Zweck|Purpose):\s+(.*)/.exec(obj.common.source)[2];
                                 }
                                 let result = convertBlockly(obj.common.source);
                                 sourceNew = result.source;
                                 data = result.xml;
                                 //if(dbg) log(result.xml)
                                 break;
                             case 'javascript/js':
                                 ext = '.js';
                                 sourceNew = obj.common.source;
                                 if(/(Zweck|Purpose):\s+(.*)/.test(sourceNew)){
                                     Zweck = /(Zweck|Purpose):\s+(.*)/.exec(sourceNew)[2];
                                 }
                                 while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                                     changes++;
                                     sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                                 }
                                 data = sourceNew;
                                 break;
                             case 'typescript/ts':
                                 ext = '.ts';
                                 sourceNew = obj.common.source;
                                 while(sourceNew.indexOf(oldNamespace) >= 0 && sourceNew.indexOf('.scriptEnabled.') == -1){
                                     changes++;
                                     sourceNew = sourceNew.replace(oldNamespace, newNamespace)
                                 }
                                 data = sourceNew;
                                 break;
                             default:
                                 ext = 'undef';
                         }
                         if(isRunning === 'Nein' && replaceInSystemsDB && changes > 0){
                             obj.common.name += extChanged;
                             obj.common.source = sourceNew;
                             setObject(scriptId + extChanged, obj);
                         }
                         if(writeToFileSystem && changes > 0){
                             fn += extChanged + ext;
                             let fnOut = pathToRestore + fn;
                             //if(dbg) log(fnOut);
                             require('fs').writeFile(fnOut, data, e => {
                                 if(e) log('Fehler beim Schreiben der Datei: ' + e);
                             })
                         }
                         if(changes >= 0){
                             changesResult.push({
                                 Nr: scriptNo,
                                 Skript: fn,
                                 Zweck: Zweck,
                                 Instance: Instance,
                                 Type: obj.common.engineType,
                                 Changes: changes,
                                 isRunning: isRunning
                             })
                         }
                     }
                 })
                 require('fs').writeFile(pathToRestore + 'scriptsFound.json', JSON.stringify(changesResult,null,4),e =>{
                     if(e) log('Fehle beim Schreiben von Datei: ' + e);
                 })
                 changesResult.sort((a,b) => a.Skript.localeCompare(b.Skript));
                 scriptNo = 1;
                 changesResult.forEach(obj => {
                     obj.Nr = scriptNo++;
                 })
                 if(existsState('0_userdata.0.scriptCheck')){
                     setState('0_userdata.0.scriptCheck', JSON.stringify(changesResult));
                 } else{
                     log('Der DP 0_userdata.0.scriptCheck muss händisch angelegt werden!', 'error')
                 }
              }
              /**
              * konvertiere Blockly Sourcecode
              * @param {string} source - base64 codierter Source
              * @returns {object} konvertierte Daten
              */
              function convertBlockly(source){
                 let regex = new RegExp(oldNamespace, "g");
                 let blocklyHeaderTmp = source.split('\n')
                 blocklyHeaderTmp.pop();
                 let blocklyHeader = blocklyHeaderTmp.join('\n').replace(regex, newNamespace) + '\n//'; 
                 const pos = source.lastIndexOf('\n');
                 if (pos !== -1) {
                     let base64Str = source.substring(pos + 3);
                     if(base64Str.indexOf('JTNDeG1sJTIweG1') > -1) {
                         let xml = decodeURIComponent(Buffer.from(base64Str, 'base64').toString('utf8'));
                         let xmlNew = convertJsFunction(xml);
                         //if(dbg) log(xml);
                         while(xmlNew.indexOf(oldNamespace) >= 0 && xmlNew.indexOf('.scriptEnabled.') == -1){
                             changes++;
                             xmlNew = xmlNew.replace(oldNamespace, newNamespace)
                         }
                         let sourceNew = blocklyHeader + Buffer.from(encodeURIComponent(xmlNew)).toString('base64');
                         //if(dbg) log(sourceNew);
                         return {source: sourceNew, xml: prettifyXml(xmlNew), changed: changes > 0};
                     }
                 }
              }
              /**
              * konvertiere Blockly JS-Funktion
              * @param {string} xml - blockly xml
              * @returns {string} konvertierte Daten
              */
              function convertJsFunction(xml) {
                 let b64 = new RegExp(/(?:"SCRIPT">)([^<]+)(?:<\/field>)/g);
                 let m;
                 while ((m = b64.exec(xml)) !== null) {
                     if (m.index === b64.lastIndex) b64.lastIndex++;
                     let fnc = Buffer.from(m[1], 'base64').toString();
                     while(fnc.indexOf(oldNamespace) >= 0){
                         changes++;
                         fnc = fnc.replace(oldNamespace, newNamespace);
                     }
                     fnc = Buffer.from(fnc).toString('base64');
                     xml = xml.replace(m[1],fnc);
                 }
                 return xml;
              }
              
              //from Stackoverflow
              function prettifyXml(xml){
                 var reg = /(>)\s*(<)(\/*)/g;
                 xml = xml.replace(/\r|\n/g, ''); //deleting already existing whitespaces
                 xml = xml.replace(reg, '$1\r\n$2$3');
                 return xml;
              }
              
              function checkPath(){
                 if(pathToRestore.lastIndexOf('/') != pathToRestore.length -1){
                     log('Der Pfad in pathToRestore muss mit einem Slash(/) abschliessen!','error');
                     return false;
                 }
                 if(!require('fs').existsSync(pathToRestore)){
                     log('Der Pfad in pathToRestore(' + pathToRestore +') existiert nicht!','error');
                     return false;
                 }
                 return true
              }
              
              switchDPs();
              
              



              {
              "settings": {
              "style": {
              "background_class": ""
              },
              "theme": "redmond",
              "sizex": "",
              "sizey": "",
              "gridSize": "10",
              "snapType": 2
              },
              "widgets": {
              "e00001": {
              "tpl": "i-vis-jsontable",
              "data": {
              "g_fixed": false,
              "g_visibility": false,
              "g_css_font_text": false,
              "g_css_background": false,
              "g_css_shadow_padding": false,
              "g_css_border": false,
              "g_gestures": false,
              "g_signals": false,
              "g_last_change": false,
              "visibility-cond": "==",
              "visibility-val": 1,
              "visibility-groups-action": "hide",
              "iTblRowLimit": "500",
              "iTableRefreshRate": "0",
              "iColCount": "7",
              "iColShow1": "true",
              "iTblTextAlign1": "center",
              "iTblCellFormat1": "normal",
              "iTblCellImageSize1": "200",
              "iTblCellBooleanCheckbox1": "false",
              "iTblCellBooleanColorFalse1": "#ff0000",
              "iTblCellBooleanColorTrue1": "#00ff00",
              "iTblCellNumberDecimals1": "2",
              "iTblCellNumberDecimalSeperator1": ".",
              "iTblCellNumberThousandSeperator1": ",",
              "iTblCellThresholdsDp1": "",
              "iTblCellThresholdsText1": "",
              "iOpacityAll": "1",
              "iTblRowEvenColor": "#333333",
              "iTblRowUnevenColor": "#455618",
              "iTblHeaderColor": "#333333",
              "iRowSpacing": "10",
              "iTblRowEvenTextColor": "#ffffff",
              "iTblRowUnevenTextColor": "#ffffff",
              "iTblHeaderTextColor": "#ffffff",
              "iBorderSize": "1",
              "iBorderStyleLeft": "solid",
              "iBorderStyleRight": "solid",
              "iBorderStyleUp": "solid",
              "iBorderStyleDown": "solid",
              "iBorderColor": "#ffffff",
              "signals-cond-0": "==",
              "signals-val-0": true,
              "signals-icon-0": "/vis/signals/lowbattery.png",
              "signals-icon-size-0": 0,
              "signals-blink-0": false,
              "signals-horz-0": 0,
              "signals-vert-0": 0,
              "signals-hide-edit-0": false,
              "signals-cond-1": "==",
              "signals-val-1": true,
              "signals-icon-1": "/vis/signals/lowbattery.png",
              "signals-icon-size-1": 0,
              "signals-blink-1": false,
              "signals-horz-1": 0,
              "signals-vert-1": 0,
              "signals-hide-edit-1": false,
              "signals-cond-2": "==",
              "signals-val-2": true,
              "signals-icon-2": "/vis/signals/lowbattery.png",
              "signals-icon-size-2": 0,
              "signals-blink-2": false,
              "signals-horz-2": 0,
              "signals-vert-2": 0,
              "signals-hide-edit-2": false,
              "lc-type": "last-change",
              "lc-is-interval": true,
              "lc-is-moment": false,
              "lc-format": "",
              "lc-position-vert": "top",
              "lc-position-horz": "right",
              "lc-offset-vert": 0,
              "lc-offset-horz": 0,
              "lc-font-size": "12px",
              "lc-font-family": "",
              "lc-font-style": "",
              "lc-bkg-color": "",
              "lc-color": "",
              "lc-border-width": "0",
              "lc-border-style": "",
              "lc-border-color": "",
              "lc-border-radius": 10,
              "lc-zindex": 0,
              "oid": "0_userdata.0.scriptCheck",
              "iTblShowHead": true,
              "iTblFixedHead": true,
              "iVertScroll": true,
              "iColShow2": "true",
              "iTblTextAlign2": "left",
              "iTblCellFormat2": "normal",
              "iTblCellImageSize2": "200",
              "iTblCellBooleanCheckbox2": "false",
              "iTblCellBooleanColorFalse2": "#ff0000",
              "iTblCellBooleanColorTrue2": "#00ff00",
              "iTblCellNumberDecimals2": "2",
              "iTblCellNumberDecimalSeperator2": ".",
              "iTblCellNumberThousandSeperator2": ",",
              "iTblCellThresholdsDp2": "",
              "iTblCellThresholdsText2": "",
              "iColShow3": "true",
              "iTblTextAlign3": "left",
              "iTblCellFormat3": "normal",
              "iTblCellImageSize3": "200",
              "iTblCellBooleanCheckbox3": "false",
              "iTblCellBooleanColorFalse3": "#ff0000",
              "iTblCellBooleanColorTrue3": "#00ff00",
              "iTblCellNumberDecimals3": "2",
              "iTblCellNumberDecimalSeperator3": ".",
              "iTblCellNumberThousandSeperator3": ",",
              "iTblCellThresholdsDp3": "",
              "iTblCellThresholdsText3": "",
              "iBorderRemoveDouble": true,
              "iColShow4": "true",
              "iTblTextAlign4": "center",
              "iTblCellFormat4": "normal",
              "iTblCellImageSize4": "200",
              "iTblCellBooleanCheckbox4": "false",
              "iTblCellBooleanColorFalse4": "#ff0000",
              "iTblCellBooleanColorTrue4": "#00ff00",
              "iTblCellNumberDecimals4": "2",
              "iTblCellNumberDecimalSeperator4": ".",
              "iTblCellNumberThousandSeperator4": ",",
              "iTblCellThresholdsDp4": "",
              "iTblCellThresholdsText4": "",
              "iColShow5": "true",
              "iTblTextAlign5": "left",
              "iTblCellFormat5": "normal",
              "iTblCellImageSize5": "200",
              "iTblCellBooleanCheckbox5": "false",
              "iTblCellBooleanColorFalse5": "#ff0000",
              "iTblCellBooleanColorTrue5": "#00ff00",
              "iTblCellNumberDecimals5": "2",
              "iTblCellNumberDecimalSeperator5": ".",
              "iTblCellNumberThousandSeperator5": ",",
              "iTblCellThresholdsDp5": "",
              "iTblCellThresholdsText5": "",
              "iColShow6": "true",
              "iTblTextAlign6": "right",
              "iTblCellFormat6": "normal",
              "iTblCellImageSize6": "200",
              "iTblCellBooleanCheckbox6": true,
              "iTblCellBooleanColorFalse6": "#ff0000",
              "iTblCellBooleanColorTrue6": "#00ff00",
              "iTblCellNumberDecimals6": "2",
              "iTblCellNumberDecimalSeperator6": ".",
              "iTblCellNumberThousandSeperator6": ",",
              "iTblCellThresholdsDp6": "",
              "iTblCellThresholdsText6": "",
              "iColShow7": "true",
              "iTblTextAlign7": "center",
              "iTblCellFormat7": "normal",
              "iTblCellImageSize7": "200",
              "iTblCellBooleanCheckbox7": "false",
              "iTblCellBooleanColorFalse7": "#ff0000",
              "iTblCellBooleanColorTrue7": "#00ff00",
              "iTblCellNumberDecimals7": "2",
              "iTblCellNumberDecimalSeperator7": ".",
              "iTblCellNumberThousandSeperator7": ",",
              "iTblCellThresholdsDp7": "",
              "iTblCellThresholdsText7": ""
              },
              "style": {
              "left": "10px",
              "top": "59px",
              "height": "716px",
              "width": "1273px"
              },
              "widgetSet": "vis-inventwo"
              }
              },
              "name": "scriptCheck",
              "filterList": []
              }

              SwitchDP.PNG

              liv-in-skyL Offline
              liv-in-skyL Offline
              liv-in-sky
              schrieb am zuletzt editiert von
              #6

              super - vielen dank für deinen einsatz

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

              Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

              das thema wurde bisher im anderen thread auch nur halb erwähnt - die states müssen auch noch "kopiert" werden ! beim import/export der objectstruktur werden die states nicht übernommen !!

              nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

              sigi234S FredFF 2 Antworten Letzte Antwort
              0
              • liv-in-skyL liv-in-sky

                super - vielen dank für deinen einsatz

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

                Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

                das thema wurde bisher im anderen thread auch nur halb erwähnt - die states müssen auch noch "kopiert" werden ! beim import/export der objectstruktur werden die states nicht übernommen !!

                sigi234S Online
                sigi234S Online
                sigi234
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #7

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

                die states müssen auch noch "kopiert" werden

                Verstehe Bahnhof?

                Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                Immer Daten sichern!

                liv-in-skyL 2 Antworten Letzte Antwort
                0
                • sigi234S sigi234

                  @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-skyL Offline
                  liv-in-skyL Offline
                  liv-in-sky
                  schrieb am zuletzt editiert von
                  #8

                  @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

                  nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                  1 Antwort Letzte Antwort
                  0
                  • sigi234S sigi234

                    @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-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    schrieb am zuletzt editiert von
                    #9

                    @sigi234

                    Image 2.png

                    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                    1 Antwort Letzte Antwort
                    0
                    • liv-in-skyL liv-in-sky

                      super - vielen dank für deinen einsatz

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

                      Die neuen Datenpunkte unter 0_userdata.0 sollten/müssen vor dem Neustart der Skripte natürlich schon vorhanden sein(Export Objekstruktur => Ersetzen alter Namespace mit neuem Namespace => Import unter 0_userdata.0)

                      das thema wurde bisher im anderen thread auch nur halb erwähnt - die states müssen auch noch "kopiert" werden ! beim import/export der objectstruktur werden die states nicht übernommen !!

                      FredFF Offline
                      FredFF Offline
                      FredF
                      Most Active Forum Testing
                      schrieb am zuletzt editiert von
                      #10

                      @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-skyL 2 Antworten Letzte Antwort
                      0
                      • sigi234S sigi234

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

                        @sigi234 Der Fehler lag in Zeile 26(nach 'Verbesserung' von Variablennamen. Setze dennoch dbg auf false, da wird sehr viel Müll geloggt

                        Du hast den Namespace in Zeile 11 nicht geändert, das wird dir keine Änderungen zeigen, ist aber für die Auflistung deiner Skripte völlig ok

                        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?

                        Info:
                        Tabelle wird Richtig im Verzeichnis angelegt.

                        LOG:

                        javascript.0
                        2021-08-18 08:35:56.416	info	script.js.Sigi.Namespace1: registered 0 subscriptions and 0 schedules
                        
                        javascript.0
                        2021-08-18 08:35:56.415	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.415	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.415	warn	at switchDPs (script.js.Sigi.Namespace1:116:8)
                        
                        javascript.0
                        2021-08-18 08:35:56.415	warn	at setState (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:1439:20)
                        
                        javascript.0
                        2021-08-18 08:35:56.414	warn	You are assigning a array to the state "0_userdata.0.scriptCheck" which expects a string. Please fix your code to use a string or change the state type to array. This warning might become an error in future versions.
                        
                        javascript.0
                        2021-08-18 08:35:56.410	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.410	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.410	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.409	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.409	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.409	warn	getState "javascript.0.scriptEnabled.global.messages" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.409	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.408	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.408	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.408	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.408	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.407	warn	getState "javascript.0.scriptEnabled.global.linkeddevices.linkeddevices0" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.407	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.407	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.406	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.406	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.406	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.405	warn	getState "javascript.0.scriptEnabled.global.function_event" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.405	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.405	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.405	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.405	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.405	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.404	warn	getState "javascript.0.scriptEnabled.global.Skript_1" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.404	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.404	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.404	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.404	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.404	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.403	warn	getState "javascript.0.scriptEnabled.global.Material_sendTo" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.400	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.400	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.400	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.400	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.400	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.399	warn	getState "javascript.0.scriptEnabled.global.MaterialDesignWidgets.vis-materialdesign0" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.399	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.399	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.399	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.398	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.398	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:56.397	warn	getState "javascript.0.scriptEnabled.global.Datum_holen" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:56.001	warn	at script.js.Sigi.Namespace1:189:3
                        
                        javascript.0
                        2021-08-18 08:35:56.001	warn	at script.js.Sigi.Namespace1:186:1
                        
                        javascript.0
                        2021-08-18 08:35:56.001	warn	at switchDPs (script.js.Sigi.Namespace1:25:14)
                        
                        javascript.0
                        2021-08-18 08:35:56.001	warn	at Object.result.each (C:\Program Files\iobroker\Home\node_modules\iobroker.javascript\lib\sandbox.js:819:29)
                        
                        javascript.0
                        2021-08-18 08:35:56.001	warn	at script.js.Sigi.Namespace1:27:24
                        
                        javascript.0
                        2021-08-18 08:35:55.998	warn	getState "javascript.0.scriptEnabled.Rules.Skript_1" not found (3) states[id]=null
                        
                        javascript.0
                        2021-08-18 08:35:55.208	info	Start javascript script.js.Sigi.Namespace1
                        
                        javascript.0
                        2021-08-18 08:35:54.862	info	Stop script script.js.Sigi.Namespace1
                        

                        Konfig:

                        /**
                        * Zweck:           Ändert Namespace von Datenpunkten in Skripten
                        * Datum:           17.08.2021
                        * Author:          @fastfoot
                        * Forum:           https://forum.iobroker.net/topic/47113/skript-namespace-f%C3%BCr-datenpunkte-in-skripten-abändern
                        */
                        let dbg = false;                        // Zusatzausgaben fürs Debugging
                        const newNamespace = '0_userdata.0';      //neuer Namespace für DP
                         
                        //          Eigene Einstellungen
                        const oldNamespace = '0_userdata.0.oldNamespace';       //Ordner für Namespace welcher ersetzt wird
                        const replaceInSystemsDB = false;// lädt geänderte Dateien sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
                        const writeToFileSystem = true;// Geänderte Dateien ins Filesystem schreiben
                        const pathToRestore = 'C:/Program Files/iobroker/Home/backups/switched/'; // <=== Pfad eintragen mit abschliessendem /
                        const extChanged = 'Chg';   // Wird im Falle einer Änderung an ID und Name angehangen
                         
                        
                        F Offline
                        F Offline
                        fastfoot
                        schrieb am zuletzt editiert von
                        #11

                        @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));

                        iobroker läuft unter Docker auf QNAP TS-451+
                        SkriptRecovery: https://forum.iobroker.net/post/930558

                        liv-in-skyL 1 Antwort Letzte Antwort
                        0
                        • FredFF FredF

                          @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-skyL Offline
                          liv-in-skyL Offline
                          liv-in-sky
                          schrieb am zuletzt editiert von
                          #12

                          @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

                          nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                          1 Antwort Letzte Antwort
                          1
                          • FredFF FredF

                            @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-skyL Offline
                            liv-in-skyL Offline
                            liv-in-sky
                            schrieb am zuletzt editiert von liv-in-sky
                            #13

                            @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

                            nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                            FredFF 1 Antwort Letzte Antwort
                            0
                            • liv-in-skyL Offline
                              liv-in-skyL Offline
                              liv-in-sky
                              schrieb am zuletzt editiert von liv-in-sky
                              #14

                              @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

                              nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                              1 Antwort Letzte Antwort
                              0
                              • liv-in-skyL 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

                                FredFF Offline
                                FredFF Offline
                                FredF
                                Most Active Forum Testing
                                schrieb am zuletzt editiert von
                                #15

                                @liv-in-sky :+1: Das werde ich testen

                                1 Antwort Letzte Antwort
                                0
                                • F fastfoot

                                  @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-skyL Offline
                                  liv-in-skyL Offline
                                  liv-in-sky
                                  schrieb am zuletzt editiert von
                                  #16

                                  @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()
                                  
                                  
                                  
                                  
                                  

                                  nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                  F 2 Antworten Letzte Antwort
                                  0
                                  • liv-in-skyL liv-in-sky

                                    @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 Offline
                                    F Offline
                                    fastfoot
                                    schrieb am zuletzt editiert von
                                    #17

                                    @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

                                    iobroker läuft unter Docker auf QNAP TS-451+
                                    SkriptRecovery: https://forum.iobroker.net/post/930558

                                    1 Antwort Letzte Antwort
                                    0
                                    • liv-in-skyL liv-in-sky

                                      @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 Offline
                                      F Offline
                                      fastfoot
                                      schrieb am zuletzt editiert von
                                      #18

                                      @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:grimacing:

                                      /**
                                       * 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))
                                      });
                                      

                                      iobroker läuft unter Docker auf QNAP TS-451+
                                      SkriptRecovery: https://forum.iobroker.net/post/930558

                                      liv-in-skyL 1 Antwort Letzte Antwort
                                      0
                                      • F fastfoot

                                        @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:grimacing:

                                        /**
                                         * 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-skyL Offline
                                        liv-in-skyL Offline
                                        liv-in-sky
                                        schrieb am zuletzt editiert von
                                        #19

                                        @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

                                        nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                        F 1 Antwort Letzte Antwort
                                        0
                                        • liv-in-skyL liv-in-sky

                                          @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 Offline
                                          F Offline
                                          fastfoot
                                          schrieb am zuletzt editiert von
                                          #20

                                          @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!

                                          iobroker läuft unter Docker auf QNAP TS-451+
                                          SkriptRecovery: https://forum.iobroker.net/post/930558

                                          liv-in-skyL 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          760

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe