NEWS
[Skript] Namespace für Datenpunkte in Skripten abändern
-
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
- Auflistung aller Skripte mit Name und Pfad, Beschreibung(wenn Header gepflegt wird), Instanz, Typ, Anzahl der erforderlichen Änderungen, Status(läuft/läuft nicht)
-
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');
- findet alle Skripte:
-
Damit auch alle Skripte gefunden werden, die Instanz immer als * angeben, also
javascript.*.
-
-
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
-
@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
-
@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
-
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 !!
-
@liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:
die states müssen auch noch "kopiert" werden
Verstehe Bahnhof?
-
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
-
-
@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?
-
@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));
-
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
-
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
-
man müßte doch auch ein script machen können, das die einnzelnen vis views ändert
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
-
@liv-in-sky
Das werde ich testen
-
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:
script:
-
@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
-
@liv-in-sky warum in allen Dateien suchen? Die vis-views.json sollte es doch tun.
Bei deinen Funktionen habe ich nicht recht durchgeblickt, deshalb so:hier für Mutige, habe nicht einmal die Vis gestoppt. Seltsamerweise funktioniert readFileAsync() hier nicht, mit keinem meiner Files kommt da was zurück, deswegen mit Callback. Trau Dich
/** * Zweck: Ändert Namespace in VIS */ const visPath = "vis.0"; let oldObjectPath = "controll-own.0"; let newObjectPath = "0_userdata.0.CONTROL-OWN"; let re = new RegExp(oldObjectPath, "g"); readFile(visPath, 'main/vis-views.json', function (e,visData){ if(e){ log('Fehler: ' + e); return; } //Backup writeFileAsync(visPath, 'main/vis-views.json.bak', visData); //just switch :-) writeFileAsync(visPath, 'main/vis-views.json', visData.replace(re,newObjectPath)) });
-
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
-
@liv-in-sky sagte in [Skript] Namespace für Datenpunkte in Skripten abändern:
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!