Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Admin5: Ich kann keine Objekte mehr manuell anlegen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Admin5: Ich kann keine Objekte mehr manuell anlegen

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Abruni @Homoran last edited by

      @homoran said in Admin5: Ich kann keine Objekte mehr manuell anlegen:
      könnte?
      Und dass ist wovon abhängig, kommt das automatisch mit der Zeit, oder ist das zufällig wie das Wetter? Wird das vorher nochmal kommuniziert, oder trifft es einen dann irgendwann überraschend, dass nichts mehr funktioniert? Gab es da vorher, mal einen Hinweis den ich nicht mitbekommen habe, dass man seine DP zu 0_Userdata umziehen sollte? Und, gibt es dafür evtl. einen Lösungsvorschlag?

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

        @liv-in-sky sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

        ich möchte meine datenpunkte von "controll-own.0" nach "0_userdata.0.controll-own." umstellen

        du kannst doch unmittelbar vor dem Schreiben der XML-Datei ein data.replace(/oldPath/g,newPath) machen. Schwierig wird es mit JS-Funktionen, die sind auch base64 codiert, sollte aber gehen

        Hier mal ein kmpl. anderer Ansatz, extrahiert werden alle Skripte aus einer objects.json und wahlweise als Textdatei und/oder ins System geschrieben(mit Endung .bak). Eine Auflistung der Skripte wird in eine json exportiert.

        • Backup machen!
        • System stoppen(sonst könnte die objects.json beschädigt sein!)
        • objects.json nach zB /opt/iobroker/restore im Testsystem kopieren (oder im Produktiv 🙂 )
        • Die Zeilen 8-11 beachten
        • Skript laufen lassen und den Export anschauen, danach die Variablen zum Schreiben in eine Datei oder ins System auf true setzen
        • evtl. den Lauf auf ein einziges Skript/einzelnen Pfad (Zeile 32) beschränken, sonst wird es schnell unübersichtlich
        • Backup nicht vergessen!

        habe es nicht mehr extra laufen lassen, sollte aber noch funktionieren, sonst halt melden. Die replace Funktionen sind nicht drin, bei Blockly in handleBlockly() einfach einbauen

        /**
        * Zweck:   Extract scripts from objects.json
        * Datum:   16.11.2020
        * Autor:   @fastfoot
        */
        const fs = require('fs'),
           path = require('path'),
           restoreToSystemDb = !true,              // lädt die Daten sofort ins System(ACHTUNG! *** auf eigenes Risiko ***)
           restoreAsFile = !true,                  // Datei ins Filesystem schreiben
           pathToRestore = '/opt/iobroker/restore/', // <=== Pfad eintragen mit abschliessendem /
           fileName = 'objects.json';              // Dateiname der objects.json
        
        main(pathToRestore, fileName)
        
        async function main(pathRestore, fileName) {
           let allObjects = {},
               script = {},
               ext = '',
               data = '',
               resultText = 'Gefundene Skripte ' + formatDate(new Date().getTime(),'DD.MM.YYYY hh:mm') + '\n\n',
               res = {};
        
           try {
               allObjects = JSON.parse(fs.readFileSync(pathRestore + fileName, 'utf8'))
           } catch (e) {
               log(`Fehler beim Lesen von ${fileName} in ${pathRestore}: ` + e, "error")
           }
           let i = 0;
           for (let key in allObjects) {
               script = allObjects[key];
               if (script.type == 'script') {
                   if (!existsObject(key)  && restoreToSystemDb) {
                       script.common.name += '.bak';
                       setObject(key, { type: script.type, common: script.common });
                       //setObject(key, allObjects[key]);
                   }
                   if (restoreAsFile) {
                       data = script.common.source;
                       switch (script.common.engine.toLowerCase()) {
                           case 'blockly':
                               ext = 'xml';
                               data = handleBlockly(script.common.source)
                               break;
                           case 'javascript/js':
                               ext = '.js';
                               break;
                           case 'typescript/ts':
                               ext = '.ts';
                               break;
                           default:
                               ext = '.js';
                       }
                       fs.writeFile(pathRestore + key.substring(10) + ext, data, e => {
                           if (e) log('Fehler beim Schreiben der Datei:' + e.error)
                       })
                   }
                   //res[key.substr(10)] = {name: script.common.name,typ:script.common.engineType};
                   res[key.substr(10)] = script.common.engineType;
                   //resultText += 'Skript: ' + script.common.name + '\t\t\t\t\t\t' + 'Typ: ' + script.common.engineType + '\n';
               }
           }
           /*fs.writeFile(pathRestore + 'GefundeneSkripte.txt', resultText, e => {
               if (e) log('Schreibfehler bei Ergebnisdatei');
           })*/
        
           // sortieren
           let b = {};
           let a=Object.keys(res).sort();
           for(let i=0;i<a.length;i++){
               b[i + ' ' + a[i]]=res[a[i]];
           }
        
           fs.writeFile(pathRestore + 'GefundeneSkripte.json', JSON.stringify(b,null,3), e => {
               if (e) log('Schreibfehler bei Ergebnisdatei');
           })
        
           log('done')
        }
        
        function handleBlockly(source){
           const pos = source.lastIndexOf('\n');
           if (pos !== -1) {
               source = source.substring(pos + 3);
               if(source.indexOf('JTNDeG1sJTIweG1') > -1) {
                   source = decodeURIComponent(Buffer.from(source, 'base64').toString('utf8'));
                   return prettifyXml(source);
               }
           }
        }
        
        //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;
        }
        

        liv-in-sky 1 Reply Last reply Reply Quote 3
        • Homoran
          Homoran Global Moderator Administrators @Abruni last edited by

          @abruni Ist diese Antwort ernst gemeint?
          ich hoffe nicht.

          trotzdem:
          Das ist doch alles bereits gesagt worden.

          • bei einer breaking change in einem Namespace eines jeden Adapters könnte es dazu kommen, dass erst einmal alles geleert wird.
          • so etwas steht dann in dem changelog, der dir ja jetzt ab admin v5 angezeigt wird, bevor du auf update klickst
          • dies bei javascript die nächste Zeit nicht passieren wird
          • und selbstverständlich vorher kommuniziert wird.
            • genau wie die Information seit der Existenz des Namespaces 0_userdata.0, dass dies der Platz für eigene Datenpunkte sein soll mit Ausnahme von javascript.0/1/2...
          A 1 Reply Last reply Reply Quote -1
          • A
            Abruni @Homoran last edited by

            @homoran
            Ist diese Antwort ernst gemeint?
            Ja, weil meine Fragen immer noch nicht beantwortet wurden, bzw. widersprüchlich.
            so etwas steht dann in dem changelog, der dir ja jetzt ab admin v5 angezeigt wird
            Kann ich das wissen, ohne Admin5 installiert zu haben? Ich würde wohl kaum fragen, wenn ich keine Bedenken hätte dies zu tun.
            genau wie die Information seit der Existenz des Namespaces 0_userdata.0, dass dies der Platz für eigene Datenpunkte sein soll mit Ausnahme von javascript.0/1/2...
            Genauso habe ich es doch auch geschrieben und habe JEDE Empfehlung befolgt. Bevor es 0_Userdata gab, sollten eigene DP im Javascript.0 angelegt werden, habe ich gemacht. Dann kam der Ordner 0_Userdata und die Empfehlung die DP dort anzulegen, habe ich gemacht. Also verstehe ich nicht, warum Du so einen Ton anschlägst und da Du selber schreibst "mit Ausnahme von javascript.0/1/2" weiss ich immer noch nicht, wie eine Lösung aussehen könnte.

            crunchip Homoran 2 Replies Last reply Reply Quote 0
            • crunchip
              crunchip Forum Testing Most Active @Abruni last edited by

              @abruni sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

              weiss ich immer noch nicht, wie eine Lösung aussehen könnte.

              die Lösung ist, das alles was in javascript angelegt wurde bis auf weiteres auch dort bleiben kann. Für Neuankömmlinge wurde der userdata geschaffen um es zukünftig übersichtlicher zu gestalten und etwaige Fehler vermieden werden.
              ein "umsetzen" von javascript zu userdata ist letztendlich jedem selbst überlassen

              A 1 Reply Last reply Reply Quote 1
              • Homoran
                Homoran Global Moderator Administrators @Abruni last edited by

                @abruni jetzt bin ich aber massiv verwirrt.

                Abgesehen davon, dass ich den unstrukturierten Text jetzt mehrfach gelesen habe, verstehe ich wirklich nicht wo du ein Problem mit meiner Antwort hattest.

                Ich habe leider nicht auf die Frage mit dem Wetter geantwortet, aber denke sonst alles beantwortet zu haben

                1 Reply Last reply Reply Quote 0
                • A
                  Abruni @crunchip last edited by

                  @crunchip
                  Ja danke. Mit genau so einer Antwort kann ich etwas anfangen. Mit der Aussage "die DP könnten gelöscht werden", ohne weiter drauf einzugehen, wann und wodurch eher nicht. Wenn es möglich ist, nach und nach die DP von Javascript nach 0_Userdata umzuziehen, steht doch einem Update nichts mehr im Wege. Nochmals DANKE!

                  1 Reply Last reply Reply Quote 0
                  • Dr. Bakterius
                    Dr. Bakterius Most Active @apollon77 last edited by

                    @apollon77 sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

                    Du kannst den JavaScript code Anpassen aber das ändert nichts an den Daten in den Blocklies

                    Das bedeutet, dass man in diesem Fall jedes Blockly öffnen, exportieren, suchen/ersetzen, importieren und wieder speichern muss um entsprechende Punkte zu ändern? Dann lass ich es lieber in 'javascript.0' liegen - ist mir zu viel Aufwand. Ich hoffe nur, dass ihr da nie mal meint, dass das nicht mehr regelkonform ist und man gezwungen wird das zu ändern.

                    F 1 Reply Last reply Reply Quote 2
                    • F
                      fastfoot @Dr. Bakterius last edited by

                      @dr-bakterius sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

                      ist mir zu viel Aufwand

                      ein paar Posts weiter oben geht es um das automatische Ersetzen im Blockly, auch aus einem Pfad heraus. Vielleicht hilft dir das ja

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

                        @fastfoot vielen dank - ich muss das script mal in ruhe ansehen - schaut interessant aus

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

                          Hallo, da ich auch so meine Probleme mit den Erstellen von Datenpunkten in meinen erstellten Verzeichnissen (jetzt Ordner) hatte, habe ich zuerst den Objektbaum als JSON gespeichert und dann vollständig gelöscht. Dann habe ich mich an die Arbeit gemacht und jeden einzelnen Ordner inkl. Unterverzeichnis neu angelegt und dann im Anschluss den zuvor exportierten JSON wieder importiert.
                          Meine erstellten Objekte waren alle wieder vorhanden und in den angelegten Ordnern wieder verfügbar. Jetzt war es mir wieder möglich ein neues Objekt zu erstellen.

                          Selbiges gilt auch für MQTT, jetzt kann ich dort auch wieder in den einzelnen Verzeichnissen / Ordner meine eigenen Datenpunkte erstellen.

                          Einfacher wäre es natürlich, dass man im Nachgang auswählen kann, dass es sich um einen Ordner handelt. Das hätte einiges an Arbeit und Zeit eingespart.😢 😬 👍

                          hier mal ein Ausschnitt:
                          2021-08-09_111128.jpg

                          mickym 1 Reply Last reply Reply Quote 1
                          • mickym
                            mickym Most Active @falke69 last edited by

                            @falke69 Mit dem Skript von fastfood geht das in 1 min - habe auch alle meine mqtt, userdata, alias so gepatched.

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

                              @liv-in-sky sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

                              @fastfoot vielen dank - ich muss das script mal in ruhe ansehen - schaut interessant aus

                              ist kein Hexenwerk.

                              • Es wird jedes Objekt geprüft, ob es ein Skript ist(type == 'script'). Wenn ja, wird das Skript so wie es ist in das System übernommen, mit der Endung .bak. Allerdings nur wenn es nicht vorhanden ist und die Variable zum Einlesen ins System gesetzt ist(restoreToSystemDb == true). Diese Funktionalität eignet sich nur für ein Restore bei verlorenem Skript
                              • Soll das Skript als File gespeichert werden(restoreAsFile == true) dann wird der Typ bestimmt(blockly, js, ts) und entsprechend der Source extrahiert und mit der passenden Endung ins Dateisystem geschrieben
                              • Im zweiten Fall kann man ein einfaches replace einbauen, um die Datenpunkte zu ändern. Für js Files könnte man entsprechend den Punkt 1 aufbohren, für Blocklys jedoch nicht da hier nur das XML extrahiert wird, der vorangestellte js code jedoch nicht behandelt wird, das ist also ungeeignet zum direkten Import ins System
                              • Für alle Skripte wird eine Summary gebildet und ins Dateisystem geschrieben, so als Übersicht was man alles an Skripten hat. Dies passiert unabhängig davon ob man Skripte importiert oder als Datei schreibt

                              Zum Spielen damit ist halt ein Testsystem sehr gut geeignet. Da ich Docker verwende ist ein solches in wenigen Minuten erstellt und auch schnell wieder gelöscht. Wobei, wenn man nur ins Dateisystem exportiert kann man absolut nichts falsch machen, die einzulesende objects.json muss ja eh eine Kopie des Originals sein, das geht auch wenn man nur ein System zur Verfügung hat

                              falke69 1 Reply Last reply Reply Quote 0
                              • falke69
                                falke69 @mickym last edited by

                                @mickym

                                das habe ich sicherlich übersehen. 😵

                                1 Reply Last reply Reply Quote 0
                                • falke69
                                  falke69 @fastfoot last edited by

                                  @fastfoot

                                  dann suche ich mir das mal mir raus. Vielleicht kann man das ja irgendwann nochmal gebrauchen. 👍

                                  mickym paul53 2 Replies Last reply Reply Quote 0
                                  • mickym
                                    mickym Most Active @falke69 last edited by mickym

                                    @falke69 Das ist doch oben in dem 1. Beitrag hier in dem Thread von apollon77 verlinkt

                                    https://forum.iobroker.net/post/660631

                                    falke69 1 Reply Last reply Reply Quote 0
                                    • falke69
                                      falke69 @mickym last edited by

                                      @mickym

                                      Danke! Muss ich übersehen haben.

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

                                        @falke69 sagte: dann suche ich mir das mal mir raus.

                                        Diese Variante erzeugt eine bessere Struktur.

                                        falke69 mickym sigi234 3 Replies Last reply Reply Quote 0
                                        • falke69
                                          falke69 @paul53 last edited by

                                          @paul53

                                          Dann teste ich die Variante auch gleich mal auf meinem Testsystem. 🙂

                                          1 Reply Last reply Reply Quote 0
                                          • mickym
                                            mickym Most Active @paul53 last edited by mickym

                                            @paul53 sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

                                            @falke69 sagte: dann suche ich mir das mal mir raus.

                                            Diese Variante erzeugt eine bessere Struktur.

                                            Ohne jetzt eine Riesendiskussion anzuschmeißen - aber ich persönlich bevorzuge nur den type Folder für bislang nicht existierende Objekte. Gerade bei selbst angelegten Strukturen, sind das eben oft keine Geräte oder Kanäle. Sobald ich die letzten Ebenen nicht als Folder, sondern als Gerät oder Kanäle anlege beschränke ich mich dann doch von vorneherein bzw. zukünftig auf die Hiearchietiefe und das ist oft nicht gewünscht.

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

                                            Support us

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

                                            813
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            36
                                            466
                                            69748
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo