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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Vorlage] Skript: Erstellen von User-Datenpunkten

NEWS

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

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

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

[Vorlage] Skript: Erstellen von User-Datenpunkten

Geplant Angeheftet Gesperrt Verschoben JavaScript
86 Beiträge 16 Kommentatoren 18.4k Aufrufe 30 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.
  • paul53P paul53

    @dslraser sagte:

    könntest Du die obige Abfrage auch so wie hier (ohne Fehlermeldung wenn noch kein DP vorhanden) anpassen ?

    Erledigt (s.o.)

    @dslraser sagte:

    mit write: true kommt der zweite angesprochene Fehler nicht.

    Die Warnung, dass setState() auf einen "read only" Datenpunkt angewendet wird, würde mich nicht stören.

    dslraserD Offline
    dslraserD Offline
    dslraser
    Forum Testing Most Active
    schrieb am zuletzt editiert von
    #5

    @paul53
    ich habe das von oben jetzt nochmal probiert, aber ich bekomme Fehler. Es wird zwar erstellt, aber nicht initialisiert. Was mache ich falsch ? Hier mein Test:

    // Datenpunkt unter 0_userdata.0 erstellen
    const idUser = 'Fenster.01Haustuer';
    const commonUser = { // nicht benötigte Attribute auskommentieren
        type: 'string', 
        read: true, 
        write: true, 
        name: '01Haustuer',
        desc: 'Sensor Haustuer', 
    //    def: 60,
    //    min: 0,     // nur bei Zahlen
    //    max: 200,   // nur bei Zahlen
    //    unit: 's',  // nur bei Zahlen
    //    states: {  // nur bei Zahlen, Logikwerten
    //        0: 'Aus',
    //        1: 'Auto',
    //        2: 'Ein'
    //    },
        role: 'string'
    };
     
    function createDp(id, common) {
        if($(id).length) log('Datenpunkt ' + id + ' existiert bereits !', 'warn');
        else {
            var obj = {};
            obj.type = 'state';
            obj.common = common;
            setObject(id, obj, function (err) {
                if (err) log('Cannot write object: ' + err)
                else {
                    var init = null;
                    if(common.def === undefined) {
                        if(common.type === 'number') init = 0;
                        if(common.type === 'boolean') init = false;
                        if(common.type === 'string') init = 'noch leer';
                    } else init = common.def;
                    setState(id, init, true);
                }
            });
        }
    }
     
    createDp('0_userdata.0.' + idUser, commonUser);
    
    javascript.0	2019-12-03 14:16:21.165	warn	(413) at process._tickCallback (internal/process/next_tick.js:68:7)
    javascript.0	2019-12-03 14:16:21.164	warn	(413) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
    javascript.0	2019-12-03 14:16:21.162	warn	(413) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
    javascript.0	2019-12-03 14:16:21.162	warn	(413) at (anonymous function).(anonymous function)._0x5c1e98 (/opt/iobroker/node_modules/iobroker.objects-redis/index.js:17:76202)
    javascript.0	2019-12-03 14:16:21.162	warn	(413) at objects.setObject (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1537:21)
    javascript.0	2019-12-03 14:16:21.161	warn	(413) at script.js.18_Test.Objekt_anlegen_2:36:17
    javascript.0	2019-12-03 14:16:21.161	warn	(413) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1404:20)
    javascript.0	2019-12-03 14:16:21.160	warn	(413) State "0_userdata.0.Fenster.01Haustuer" not found
    javascript.0	2019-12-03 14:16:21.154	info	(413) script.js.18_Test.Objekt_anlegen_2: registered 0 subscriptions and 0 schedules
    javascript.0	2019-12-03 14:16:21.142	info	(413) Start javascript script.js.18_Test.Objekt_anlegen_2
    
    paul53P 1 Antwort Letzte Antwort
    0
    • dslraserD dslraser

      @paul53
      ich habe das von oben jetzt nochmal probiert, aber ich bekomme Fehler. Es wird zwar erstellt, aber nicht initialisiert. Was mache ich falsch ? Hier mein Test:

      // Datenpunkt unter 0_userdata.0 erstellen
      const idUser = 'Fenster.01Haustuer';
      const commonUser = { // nicht benötigte Attribute auskommentieren
          type: 'string', 
          read: true, 
          write: true, 
          name: '01Haustuer',
          desc: 'Sensor Haustuer', 
      //    def: 60,
      //    min: 0,     // nur bei Zahlen
      //    max: 200,   // nur bei Zahlen
      //    unit: 's',  // nur bei Zahlen
      //    states: {  // nur bei Zahlen, Logikwerten
      //        0: 'Aus',
      //        1: 'Auto',
      //        2: 'Ein'
      //    },
          role: 'string'
      };
       
      function createDp(id, common) {
          if($(id).length) log('Datenpunkt ' + id + ' existiert bereits !', 'warn');
          else {
              var obj = {};
              obj.type = 'state';
              obj.common = common;
              setObject(id, obj, function (err) {
                  if (err) log('Cannot write object: ' + err)
                  else {
                      var init = null;
                      if(common.def === undefined) {
                          if(common.type === 'number') init = 0;
                          if(common.type === 'boolean') init = false;
                          if(common.type === 'string') init = 'noch leer';
                      } else init = common.def;
                      setState(id, init, true);
                  }
              });
          }
      }
       
      createDp('0_userdata.0.' + idUser, commonUser);
      
      javascript.0	2019-12-03 14:16:21.165	warn	(413) at process._tickCallback (internal/process/next_tick.js:68:7)
      javascript.0	2019-12-03 14:16:21.164	warn	(413) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
      javascript.0	2019-12-03 14:16:21.162	warn	(413) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
      javascript.0	2019-12-03 14:16:21.162	warn	(413) at (anonymous function).(anonymous function)._0x5c1e98 (/opt/iobroker/node_modules/iobroker.objects-redis/index.js:17:76202)
      javascript.0	2019-12-03 14:16:21.162	warn	(413) at objects.setObject (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1537:21)
      javascript.0	2019-12-03 14:16:21.161	warn	(413) at script.js.18_Test.Objekt_anlegen_2:36:17
      javascript.0	2019-12-03 14:16:21.161	warn	(413) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1404:20)
      javascript.0	2019-12-03 14:16:21.160	warn	(413) State "0_userdata.0.Fenster.01Haustuer" not found
      javascript.0	2019-12-03 14:16:21.154	info	(413) script.js.18_Test.Objekt_anlegen_2: registered 0 subscriptions and 0 schedules
      javascript.0	2019-12-03 14:16:21.142	info	(413) Start javascript script.js.18_Test.Objekt_anlegen_2
      
      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #6

      @dslraser sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

      warn (413) State "0_userdata.0.Fenster.01Haustuer" not found

      Anscheinend erfolgt setState() zu früh (neues Objekt wird noch nicht gefunden). Das sollte durch den Aufruf im Callback eigentlich nicht sein. Abhilfe schafft sicherlich eine Verzögerung.

                      setTimeout(function() {setState(id, init, true);}, 100);
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      dslraserD 1 Antwort Letzte Antwort
      0
      • paul53P paul53

        @dslraser sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

        warn (413) State "0_userdata.0.Fenster.01Haustuer" not found

        Anscheinend erfolgt setState() zu früh (neues Objekt wird noch nicht gefunden). Das sollte durch den Aufruf im Callback eigentlich nicht sein. Abhilfe schafft sicherlich eine Verzögerung.

                        setTimeout(function() {setState(id, init, true);}, 100);
        
        dslraserD Offline
        dslraserD Offline
        dslraser
        Forum Testing Most Active
        schrieb am zuletzt editiert von
        #7

        @paul53
        Danke, damit geht es.

        1 Antwort Letzte Antwort
        0
        • MicM Offline
          MicM Offline
          Mic
          Developer
          schrieb am zuletzt editiert von Mic
          #8

          @paul53
          Vielen Dank für dieses Script!

          Ich habe es in untenstehende Funktion gekapselt. Funktioniert im Prinzip so wie createState(). Zusätzlich ein dritter optionaler Parameter "warn", der, nur falls explizit auf true gesetzt, eine Warnung im Log ausgibt, falls der State bereits existiert.

          Beispielaufruf:

          createUserDataState('Test.Schaltknopf', {'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false });
          

          Die Funktion:

          /**
           * Creates a state under 0_userdata.0
           * Source: https://forum.iobroker.net/topic/26839/
           * Thanks to ioBroker forum user "paul53" for the basis of this function.
           * Version: 0.1 - Mic
           * @param {string} stateId        State ID to be created under '0_userdata.0', like 'LivingRoom.Lights.Sideboard.Brightness'
           * @param {object} param          Object with state details. Template: {'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
           * @param {boolean} [warn=false]  Optional. Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
           */
          function createUserDataState(stateId, param, warn) {
          
              if (warn === undefined) warn = false;
              const WHERE = '0_userdata.0';
              stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
              stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
          
              const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
          
              if($(FULL_STATE_ID).length) {
                  if(warn) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                  return;
              }
          
              let obj = {};
              obj.type = 'state';
              obj.common = param;
              setObject(FULL_STATE_ID, obj, function (err) {
                  if (err) {
                      log('Cannot write object: ' + err);
                  } else {
                      let init = null;
                      if(param.def === undefined) {
                          if(param.type === 'number') init = 0;
                          if(param.type === 'boolean') init = false;
                          if(param.type === 'string') init = '';
                      } else {
                          init = param.def;
                      }
                      setTimeout(function() { setState(FULL_STATE_ID, init, true); }, 50); // see https://forum.iobroker.net/post/334331
                  }
              });
          
          }
          
          dslraserD 2 Antworten Letzte Antwort
          1
          • MicM Mic

            @paul53
            Vielen Dank für dieses Script!

            Ich habe es in untenstehende Funktion gekapselt. Funktioniert im Prinzip so wie createState(). Zusätzlich ein dritter optionaler Parameter "warn", der, nur falls explizit auf true gesetzt, eine Warnung im Log ausgibt, falls der State bereits existiert.

            Beispielaufruf:

            createUserDataState('Test.Schaltknopf', {'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false });
            

            Die Funktion:

            /**
             * Creates a state under 0_userdata.0
             * Source: https://forum.iobroker.net/topic/26839/
             * Thanks to ioBroker forum user "paul53" for the basis of this function.
             * Version: 0.1 - Mic
             * @param {string} stateId        State ID to be created under '0_userdata.0', like 'LivingRoom.Lights.Sideboard.Brightness'
             * @param {object} param          Object with state details. Template: {'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
             * @param {boolean} [warn=false]  Optional. Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
             */
            function createUserDataState(stateId, param, warn) {
            
                if (warn === undefined) warn = false;
                const WHERE = '0_userdata.0';
                stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
                stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
            
                const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
            
                if($(FULL_STATE_ID).length) {
                    if(warn) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                    return;
                }
            
                let obj = {};
                obj.type = 'state';
                obj.common = param;
                setObject(FULL_STATE_ID, obj, function (err) {
                    if (err) {
                        log('Cannot write object: ' + err);
                    } else {
                        let init = null;
                        if(param.def === undefined) {
                            if(param.type === 'number') init = 0;
                            if(param.type === 'boolean') init = false;
                            if(param.type === 'string') init = '';
                        } else {
                            init = param.def;
                        }
                        setTimeout(function() { setState(FULL_STATE_ID, init, true); }, 50); // see https://forum.iobroker.net/post/334331
                    }
                });
            
            }
            
            dslraserD Offline
            dslraserD Offline
            dslraser
            Forum Testing Most Active
            schrieb am zuletzt editiert von
            #9

            @Mic
            noch ein kleiner Hinweis zu

            setTimeout(function()
            

            Je nach dem, wie viele Datenpunkte erstellt und initialisiert werden sollen muss man den Wert erhöhen. Schon ab ca 10 DP reichen schon 100 nicht mehr.
            Ich habe es jetzt auf 1000 stehen, damit gingen bisher auch ca 35 DP auf einmal.

            MicM 1 Antwort Letzte Antwort
            0
            • MicM Mic

              @paul53
              Vielen Dank für dieses Script!

              Ich habe es in untenstehende Funktion gekapselt. Funktioniert im Prinzip so wie createState(). Zusätzlich ein dritter optionaler Parameter "warn", der, nur falls explizit auf true gesetzt, eine Warnung im Log ausgibt, falls der State bereits existiert.

              Beispielaufruf:

              createUserDataState('Test.Schaltknopf', {'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false });
              

              Die Funktion:

              /**
               * Creates a state under 0_userdata.0
               * Source: https://forum.iobroker.net/topic/26839/
               * Thanks to ioBroker forum user "paul53" for the basis of this function.
               * Version: 0.1 - Mic
               * @param {string} stateId        State ID to be created under '0_userdata.0', like 'LivingRoom.Lights.Sideboard.Brightness'
               * @param {object} param          Object with state details. Template: {'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
               * @param {boolean} [warn=false]  Optional. Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
               */
              function createUserDataState(stateId, param, warn) {
              
                  if (warn === undefined) warn = false;
                  const WHERE = '0_userdata.0';
                  stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
                  stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
              
                  const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
              
                  if($(FULL_STATE_ID).length) {
                      if(warn) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                      return;
                  }
              
                  let obj = {};
                  obj.type = 'state';
                  obj.common = param;
                  setObject(FULL_STATE_ID, obj, function (err) {
                      if (err) {
                          log('Cannot write object: ' + err);
                      } else {
                          let init = null;
                          if(param.def === undefined) {
                              if(param.type === 'number') init = 0;
                              if(param.type === 'boolean') init = false;
                              if(param.type === 'string') init = '';
                          } else {
                              init = param.def;
                          }
                          setTimeout(function() { setState(FULL_STATE_ID, init, true); }, 50); // see https://forum.iobroker.net/post/334331
                      }
                  });
              
              }
              
              dslraserD Offline
              dslraserD Offline
              dslraser
              Forum Testing Most Active
              schrieb am zuletzt editiert von
              #10

              @Mic sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

              createUserDataState('Test.Schaltknopf', {'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false });

              wenn ich versuche ein String DP zu erstellen und den mit Text zu initialisieren, dann kommt eine Fehlermeldung.
              Ohne

              'def':false
              

              funktioniert es ohne Fehlermeldung.

              paul53P 1 Antwort Letzte Antwort
              0
              • dslraserD dslraser

                @Mic sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                createUserDataState('Test.Schaltknopf', {'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false });

                wenn ich versuche ein String DP zu erstellen und den mit Text zu initialisieren, dann kommt eine Fehlermeldung.
                Ohne

                'def':false
                

                funktioniert es ohne Fehlermeldung.

                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von paul53
                #11

                @dslraser sagte:

                Ohne 'def':false funktioniert es ohne Fehlermeldung.

                false ist kein String, sondern "boolean". def muss vom Typ des Datenpunktes sein.

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                dslraserD 1 Antwort Letzte Antwort
                0
                • paul53P paul53

                  @dslraser sagte:

                  Ohne 'def':false funktioniert es ohne Fehlermeldung.

                  false ist kein String, sondern "boolean". def muss vom Typ des Datenpunktes sein.

                  dslraserD Offline
                  dslraserD Offline
                  dslraser
                  Forum Testing Most Active
                  schrieb am zuletzt editiert von dslraser
                  #12

                  @paul53 sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                  false ist kein String, sondern "boolean". def muss vom Typ des Datenpunktes sein.

                  und wie muß das dann aussehen ? So kommt ein Fehler.

                  createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'string', 'def':false });
                  
                  paul53P 1 Antwort Letzte Antwort
                  0
                  • dslraserD dslraser

                    @paul53 sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                    false ist kein String, sondern "boolean". def muss vom Typ des Datenpunktes sein.

                    und wie muß das dann aussehen ? So kommt ein Fehler.

                    createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'string', 'def':false });
                    
                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von paul53
                    #13

                    @dslraser sagte:

                    und wie muß das dann aussehen ?

                    createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'irgendwas zwischen 2 Hochkommata'});
                    

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    dslraserD 1 Antwort Letzte Antwort
                    1
                    • paul53P paul53

                      @dslraser sagte:

                      und wie muß das dann aussehen ?

                      createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'irgendwas zwischen 2 Hochkommata'});
                      
                      dslraserD Offline
                      dslraserD Offline
                      dslraser
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von
                      #14

                      @paul53 sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                      createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'irgendwas zwischen 2 Hochkommata'});

                      Wenn ich das so mache, dann steht genau das als Wert im Datenpunkt (irgendwas zwischen 2 Hochkommata).

                      Bildschirmfoto 2020-01-08 um 12.59.22.png

                      Das was dann event. hier als init Wert steht, wird dann aber nicht im DP eingetragen ? Ist das so richtig ?
                      Es wird jedenfalls dann nicht mit "noch leer" initialisiert ?
                      Bildschirmfoto 2020-01-08 um 13.01.05.png

                      paul53P 1 Antwort Letzte Antwort
                      0
                      • dslraserD dslraser

                        @paul53 sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                        createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'irgendwas zwischen 2 Hochkommata'});

                        Wenn ich das so mache, dann steht genau das als Wert im Datenpunkt (irgendwas zwischen 2 Hochkommata).

                        Bildschirmfoto 2020-01-08 um 12.59.22.png

                        Das was dann event. hier als init Wert steht, wird dann aber nicht im DP eingetragen ? Ist das so richtig ?
                        Es wird jedenfalls dann nicht mit "noch leer" initialisiert ?
                        Bildschirmfoto 2020-01-08 um 13.01.05.png

                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #15

                        @dslraser sagte:

                        Es wird jedenfalls dann nicht mit "noch leer" initialisiert ?

                        Initialisierung mit "noch leer" erfolgt nur, wenn kein common.def vorhanden ist (undefined).

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        O 1 Antwort Letzte Antwort
                        1
                        • X Offline
                          X Offline
                          xbow42
                          schrieb am zuletzt editiert von xbow42
                          #16

                          @paul53 sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                          0_userdata.0

                          gibt es eigentlich ein Script bzw Anleitung mit dem ich meine bereits angelegte Struktur alles unterhalb von _MyHomeControl.0 nach 0_userdata.0 umziehen kann.
                          Am besten inkl. der Reparatur(suchen&ersetzen von _MyHomeControl.0 zu 0_userdata.0) in allen Scripten und Adapterkonfigurationen?
                          Was muss ggf. noch bedacht werden?

                          1 Antwort Letzte Antwort
                          0
                          • dslraserD dslraser

                            @Mic
                            noch ein kleiner Hinweis zu

                            setTimeout(function()
                            

                            Je nach dem, wie viele Datenpunkte erstellt und initialisiert werden sollen muss man den Wert erhöhen. Schon ab ca 10 DP reichen schon 100 nicht mehr.
                            Ich habe es jetzt auf 1000 stehen, damit gingen bisher auch ca 35 DP auf einmal.

                            MicM Offline
                            MicM Offline
                            Mic
                            Developer
                            schrieb am zuletzt editiert von Mic
                            #17

                            Sorry, mein kompletter Forumsbeitrag ist verschwunden, stattdessen war da nur ein Script in Klartext über.
                            Ich liefere morgen den kompletten Text nach. Ich darf dann alles noch mal neu schreiben :-(

                            MicM 1 Antwort Letzte Antwort
                            0
                            • MicM Mic

                              Sorry, mein kompletter Forumsbeitrag ist verschwunden, stattdessen war da nur ein Script in Klartext über.
                              Ich liefere morgen den kompletten Text nach. Ich darf dann alles noch mal neu schreiben :-(

                              MicM Offline
                              MicM Offline
                              Mic
                              Developer
                              schrieb am zuletzt editiert von
                              #18

                              @Mic
                              Achtung, Script-Update (ich kann oben leider nicht mehr editieren, warum auch immer):

                              //let test = {'id':'die State ID', name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT };
                              let test = [
                                  {'id':'Mic_Test.Datenpunkt_01', 'name':'Das ist ein Test', 'type':'string', 'read':true, 'write':true, 'role':'info', 'def':'hallo welt' },
                                  {'id':'Mic_Test.Datenpunkt_02', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_03', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_04', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_05', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_06', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_07', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_08', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_09', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_10', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_11', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_12', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_13', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_14', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_15', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_16', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_17', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_18', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_19', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_20', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_21', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_22', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_23', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_24', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_25', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_26', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_27', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_28', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_29', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_30', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_31', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_32', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_33', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_34', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_35', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_36', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_37', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_38', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_39', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_40', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_41', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_42', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_43', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_44', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_45', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_46', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_47', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_48', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_49', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_50', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_51', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_52', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_53', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_54', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_55', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_56', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_57', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_58', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_59', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_60', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_61', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_62', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_63', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_64', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_65', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_66', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_67', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_68', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_69', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_70', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_71', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_72', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_73', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_74', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_75', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_76', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_77', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_78', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_79', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_80', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_81', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_82', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_83', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_84', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_85', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_86', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_87', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_88', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_89', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_90', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_91', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_92', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_93', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_94', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_95', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_96', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_97', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_98', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                  {'id':'Mic_Test.Datenpunkt_99', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                              
                              
                              ];    
                              
                              createUserDataState(test, function() {
                                  log('Nun sind wir in der callback-Funktion. Das bedeutet, dass alle States abgearbeitet wurden. Jetzt können wir hier was machen, z.B. nächste Funktion main() aufrufen.');
                                  log('Happy coding! :-)')
                              });
                              
                              /**
                               * Creates a state under 0_userdata.0
                               * Source: https://forum.iobroker.net/topic/26839/
                               * Thanks to ioBroker forum user "paul53" for the basis of creating states outside javascript.x
                               * Version: 0.2
                               * @param {array} statesToCreate  Object or array of object with state details. Template: {'id':'Test.123.456', 'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
                               * @param {object} [callback]  Optional: a callback function -- This provided function will be executed once all states are created.
                               */
                              function createUserDataState(statesToCreate, callback) {
                              
                                  const WARN = false; // Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
                                  const LOG_DEBUG = true // To debug this function, set to true
                                  const WHERE = '0_userdata.0';   // You could change the starting path accordingly. Not recommended to change, though.
                              
                                  if(!Array.isArray(statesToCreate)) statesToCreate = [statesToCreate]; // we allow both an array of objects or a single object
                              
                                  let numStates = statesToCreate.length;
                                  let counter = -1;
                                  statesToCreate.forEach(function(param) {
                                      counter += 1;
                                      if (LOG_DEBUG) log ('Currently processing following state: [' + param.id + ']');
                              
                                      let stateId = param.id;
                                      delete param.id; // remove it, to comply with ioBroker state syntax for setObject() and setState()
                              
                                      stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
                                      stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
                              
                                      const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
                              
                                      if($(FULL_STATE_ID).length) {
                                          if (WARN) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                                          if (!WARN && LOG_DEBUG) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.');
                                          numStates--;
                                          if (numStates === 0) {
                                              if (LOG_DEBUG) log('All states successfully processed!');
                                              if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                                  if (LOG_DEBUG) log('An optional callback function was provided, which we are going to execute now.');
                                                  return callback();
                                              }
                                          } else {
                                              return; // https://stackoverflow.com/questions/18452920/continue-in-cursor-foreach
                                          }
                                      }
                              
                                      // State is not existing, so we are continuing to create the state through setObject().
                                      let obj = {};
                                      obj.type = 'state';
                                      obj.common = param;
                                      setObject(FULL_STATE_ID, obj, function (err) {
                                          if (err) {
                                              log('Cannot write object for state [' + FULL_STATE_ID + ']: ' + err);
                                          } else {
                                              if (LOG_DEBUG) log('Now we are creating new state [' + FULL_STATE_ID + ']')
                                              let init = null;
                                              if(param.def === undefined) {
                                                  if(param.type === 'number') init = 0;
                                                  if(param.type === 'boolean') init = false;
                                                  if(param.type === 'string') init = '';
                                              } else {
                                                  init = param.def;
                                              }
                                              setTimeout(function() {
                                                  setState(FULL_STATE_ID, init, true, function() {
                                                      log('setState durchgeführt: ' + FULL_STATE_ID);
                                                      numStates--;
                                                      if (numStates === 0) {
                                                          if (LOG_DEBUG) log('fertig!');
                                                          if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                                              if (LOG_DEBUG) log('Function was provided');
                                                              return callback(); // 
                                                          }
                                                      }
                                                  });
                                              }, 50 + (20 * counter) );
                                          }
                                      });
                              
                                  });
                              }
                              
                              dslraserD 2 Antworten Letzte Antwort
                              2
                              • MicM Mic

                                @Mic
                                Achtung, Script-Update (ich kann oben leider nicht mehr editieren, warum auch immer):

                                //let test = {'id':'die State ID', name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT };
                                let test = [
                                    {'id':'Mic_Test.Datenpunkt_01', 'name':'Das ist ein Test', 'type':'string', 'read':true, 'write':true, 'role':'info', 'def':'hallo welt' },
                                    {'id':'Mic_Test.Datenpunkt_02', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_03', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_04', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_05', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_06', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_07', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_08', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_09', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_10', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_11', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_12', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_13', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_14', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_15', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_16', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_17', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_18', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_19', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_20', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_21', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_22', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_23', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_24', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_25', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_26', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_27', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_28', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_29', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_30', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_31', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_32', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_33', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_34', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_35', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_36', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_37', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_38', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_39', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_40', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_41', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_42', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_43', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_44', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_45', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_46', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_47', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_48', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_49', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_50', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_51', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_52', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_53', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_54', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_55', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_56', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_57', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_58', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_59', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_60', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_61', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_62', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_63', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_64', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_65', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_66', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_67', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_68', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_69', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_70', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_71', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_72', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_73', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_74', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_75', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_76', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_77', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_78', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_79', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_80', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_81', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_82', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_83', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_84', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_85', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_86', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_87', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_88', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_89', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_90', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_91', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_92', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_93', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_94', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_95', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_96', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_97', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_98', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                    {'id':'Mic_Test.Datenpunkt_99', 'name':'Das ist ein Test', 'type':'boolean', 'read':true, 'write':true, 'role':'button', 'def':false },
                                
                                
                                ];    
                                
                                createUserDataState(test, function() {
                                    log('Nun sind wir in der callback-Funktion. Das bedeutet, dass alle States abgearbeitet wurden. Jetzt können wir hier was machen, z.B. nächste Funktion main() aufrufen.');
                                    log('Happy coding! :-)')
                                });
                                
                                /**
                                 * Creates a state under 0_userdata.0
                                 * Source: https://forum.iobroker.net/topic/26839/
                                 * Thanks to ioBroker forum user "paul53" for the basis of creating states outside javascript.x
                                 * Version: 0.2
                                 * @param {array} statesToCreate  Object or array of object with state details. Template: {'id':'Test.123.456', 'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
                                 * @param {object} [callback]  Optional: a callback function -- This provided function will be executed once all states are created.
                                 */
                                function createUserDataState(statesToCreate, callback) {
                                
                                    const WARN = false; // Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
                                    const LOG_DEBUG = true // To debug this function, set to true
                                    const WHERE = '0_userdata.0';   // You could change the starting path accordingly. Not recommended to change, though.
                                
                                    if(!Array.isArray(statesToCreate)) statesToCreate = [statesToCreate]; // we allow both an array of objects or a single object
                                
                                    let numStates = statesToCreate.length;
                                    let counter = -1;
                                    statesToCreate.forEach(function(param) {
                                        counter += 1;
                                        if (LOG_DEBUG) log ('Currently processing following state: [' + param.id + ']');
                                
                                        let stateId = param.id;
                                        delete param.id; // remove it, to comply with ioBroker state syntax for setObject() and setState()
                                
                                        stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
                                        stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
                                
                                        const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
                                
                                        if($(FULL_STATE_ID).length) {
                                            if (WARN) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                                            if (!WARN && LOG_DEBUG) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.');
                                            numStates--;
                                            if (numStates === 0) {
                                                if (LOG_DEBUG) log('All states successfully processed!');
                                                if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                                    if (LOG_DEBUG) log('An optional callback function was provided, which we are going to execute now.');
                                                    return callback();
                                                }
                                            } else {
                                                return; // https://stackoverflow.com/questions/18452920/continue-in-cursor-foreach
                                            }
                                        }
                                
                                        // State is not existing, so we are continuing to create the state through setObject().
                                        let obj = {};
                                        obj.type = 'state';
                                        obj.common = param;
                                        setObject(FULL_STATE_ID, obj, function (err) {
                                            if (err) {
                                                log('Cannot write object for state [' + FULL_STATE_ID + ']: ' + err);
                                            } else {
                                                if (LOG_DEBUG) log('Now we are creating new state [' + FULL_STATE_ID + ']')
                                                let init = null;
                                                if(param.def === undefined) {
                                                    if(param.type === 'number') init = 0;
                                                    if(param.type === 'boolean') init = false;
                                                    if(param.type === 'string') init = '';
                                                } else {
                                                    init = param.def;
                                                }
                                                setTimeout(function() {
                                                    setState(FULL_STATE_ID, init, true, function() {
                                                        log('setState durchgeführt: ' + FULL_STATE_ID);
                                                        numStates--;
                                                        if (numStates === 0) {
                                                            if (LOG_DEBUG) log('fertig!');
                                                            if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                                                if (LOG_DEBUG) log('Function was provided');
                                                                return callback(); // 
                                                            }
                                                        }
                                                    });
                                                }, 50 + (20 * counter) );
                                            }
                                        });
                                
                                    });
                                }
                                
                                dslraserD Offline
                                dslraserD Offline
                                dslraser
                                Forum Testing Most Active
                                schrieb am zuletzt editiert von
                                #19

                                @Mic
                                was macht jetzt counter ?

                                MicM 1 Antwort Letzte Antwort
                                0
                                • dslraserD dslraser

                                  @Mic
                                  was macht jetzt counter ?

                                  MicM Offline
                                  MicM Offline
                                  Mic
                                  Developer
                                  schrieb am zuletzt editiert von
                                  #20

                                  @dslraser
                                  siehe oben fettgedruckt meine Korrektur, mehr Info folgt alsbald, es hat meinen kompletten Beitrag mit allen Erklärungen gelöscht!

                                  dslraserD 1 Antwort Letzte Antwort
                                  1
                                  • MicM Mic

                                    @dslraser
                                    siehe oben fettgedruckt meine Korrektur, mehr Info folgt alsbald, es hat meinen kompletten Beitrag mit allen Erklärungen gelöscht!

                                    dslraserD Offline
                                    dslraserD Offline
                                    dslraser
                                    Forum Testing Most Active
                                    schrieb am zuletzt editiert von
                                    #21

                                    @Mic
                                    ich hatte es gestern vor Deinem letzten Beitrag mal für mich mit Deinem "vorletzten" Script probiert. Ich erstelle mir die Datenpunkte für ein Blockly in einem Blockly. Es wird auch alles richtig erstellt, spricht irgendwas dagegen, oder kann man das so machen ? Siehe Spoiler


                                    Bildschirmfoto 2020-01-09 um 19.18.54.png
                                    So habe ich es in der Funktion...

                                    //####################---Fenster Anzahl gekippt-geöffnet-geschlossen-gesamt---####################
                                    createUserDataState('Fenster_zaehlen.01_Anzahl_Fenster_gekippt', {'name':'01_Anzahl_Fenster_gekippt', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                    createUserDataState('Fenster_zaehlen.02_Anzahl_Fenster_offen', {'name':'02_Anzahl_Fenster_offen', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                    createUserDataState('Fenster_zaehlen.03_Anzahl_Fenster_geschlossen', {'name':'03_Anzahl_Fenster_geschlossen', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                    createUserDataState('Fenster_zaehlen.04_Anzahl_Fenster_gesamt', {'name':'04_Anzahl_Fenster_gesamt', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                    //####################---Fenster offene-gekippte Fenster Liste---####################
                                    createUserDataState('Fenster_zaehlen.05_offene_gekippte_Fenster_Liste', {'name':'05_offene_gekippte_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer'});
                                    //####################---DP gesamte Fenster Liste mit Zustand anlegen---####################
                                    createUserDataState('Fenster_zaehlen.06_gesamte_Fenster_Liste', {'name':'06_gesamte_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer'});
                                    //####################---Fenster Liste iQontrol anlegen---####################
                                    createUserDataState('Fenster_zaehlen.07_iQontrol_Fenster_Liste', {'name':'07_iQontrol_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer'});
                                    //####################---DP Nachrichtenversand Telegram anschalten-ausschalten anlegen---####################
                                    createUserDataState('Nachrichtenversand.Telegram.01Telegram_Nachrichtenversand_Fenster_zaehlen', {'name':'01Telegram_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false});
                                    //####################---DP Nachrichtenversand E-Mail anschalten-ausschalten anlegen---####################
                                    createUserDataState('Nachrichtenversand.EMail.01EMail_Nachrichtenversand_Fenster_zaehlen', {'name':'01EMail_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false});
                                    //####################---Alexa Datenpunkte anlegen---####################
                                    createUserDataState('Nachrichtenversand.EMail.01EMail_Nachrichtenversand_Fenster_zaehlen', {'name':'01EMail_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false});
                                    //####################---Alexa Datenpunkte anlegen---####################
                                    createUserDataState('Alexa_Ansagen.Stimmen.01Alexa', {'name':'01Alexa', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':true, "smartName": {"de": "Alexa","smartType": "SWITCH"}});
                                    createUserDataState('Alexa_Ansagen.Stimmen.02Hans', {'name':'02Hans', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Hans","smartType": "SWITCH"}});
                                    createUserDataState('Alexa_Ansagen.Stimmen.03Vicki', {'name':'03Vicki', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Vicki","smartType": "SWITCH"}});
                                    createUserDataState('Alexa_Ansagen.Stimmen.04Conchita', {'name':'04Conchita', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Conchita","smartType": "SWITCH"}});
                                    createUserDataState('Alexa_Ansagen.Stimmen.05Alexa_ssml', {'name':'05Alexa_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Alexa">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.06Hans_ssml', {'name':'06Hans_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Hans">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.07Vicki_ssml', {'name':'07Vicki_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Vicki">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.08Conchita_ssml', {'name':'08Conchita_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Conchita">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.09ssml_ende', {'name':'09ssml_ende', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice></speak>'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.10Alexa_Stimmenwechsel_ssml', {'name':'10Alexa_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Alexa">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.11Hans_Stimmenwechsel_ssml', {'name':'11Hans_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Hans">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.12Vicki_Stimmenwechsel_ssml', {'name':'12Vicki_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Vicki">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.13Conchita_Stimmenwechsel_ssml', {'name':'13Conchita_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Conchita">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.14fluestern_anfang', {'name':'14fluestern_anfang', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><amazon:effect name="whispered">'});
                                    createUserDataState('Alexa_Ansagen.Stimmen.15fluestern_ende', {'name':'15fluestern_ende', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</amazon:effect></speak>'});
                                    createUserDataState('Alexa_Ansagen.Ansagen.Fensteransage', {'name': 'Fensteransage','type': 'boolean', 'read': false, 'write': true, 'role': 'button','def':false, "smartName": {"de": "Fensteransage","smartType": "SWITCH"}});
                                    
                                    /**
                                     * Creates a state under 0_userdata.0
                                     * Source: https://forum.iobroker.net/topic/26839/
                                     * Thanks to ioBroker forum user "paul53" for the basis of this function.
                                     * Version: 0.1 - Mic
                                     * @param {string} stateId        State ID to be created under '0_userdata.0', like 'LivingRoom.Lights.Sideboard.Brightness'
                                     * @param {object} param          Object with state details. Template: {'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
                                     * @param {boolean} [warn=false]  Optional. Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
                                     */
                                    function createUserDataState(stateId, param, warn) {
                                     
                                        if (warn === undefined) warn = false;
                                        const WHERE = '0_userdata.0';
                                        stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
                                        stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
                                     
                                        const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
                                     
                                        if($(FULL_STATE_ID).length) {
                                            if(warn) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                                            return;
                                        }
                                     
                                        let obj = {};
                                        obj.type = 'state';
                                        obj.common = param;
                                        setObject(FULL_STATE_ID, obj, function (err) {
                                            if (err) {
                                                log('Cannot write object: ' + err);
                                            } else {
                                                let init = null;
                                                if(param.def === undefined) {
                                                    if(param.type === 'number') init = 0;
                                                    if(param.type === 'boolean') init = false;
                                                    if(param.type === 'string') init = 'noch leer';
                                                } else {
                                                    init = param.def;
                                                }
                                                setTimeout(function() { setState(FULL_STATE_ID, init, true); }, 1000); // see https://forum.iobroker.net/post/334331
                                            }
                                        });
                                     
                                    }
                                    

                                    MicM 1 Antwort Letzte Antwort
                                    0
                                    • MicM Offline
                                      MicM Offline
                                      Mic
                                      Developer
                                      schrieb am zuletzt editiert von
                                      #22

                                      Nun noch mal neu die Erklärung zum obigen Script vom 08.01.2020:

                                      Ich habe nun das Script wie folgt modifiziert:

                                      • Man kann nun beliebig viele zu erstellende Datenpunkte gleichzeitig übergeben.
                                      • Das Script arbeitet über callback, d.h. nach Abarbeitung (Anlegen) aller Datenpunkte kann dann danach ein beliebiger Code ausgeführt werden, z.B. eine Funktion main().

                                      D.h. die 2 Log-Zeilen ('Nun sind wir in der call-Back-Funktion...' und "Happy Coding" werden erst ausgeführt, nachdem alle States angelegt wurden. Genau so kann man hier eine andere Function, aufrufen.

                                      Da callback von setObject() scheinbar zu früh ausgeführt wird (siehe Beitrag) und setObject() bei einigen Datenpunkten immer länger braucht, habe ich zum Test einen Counter für den setTimeout() eingebaut, der damit wird jedes neue setObject() immer später ausgeführt. D.h. erster Datenpunkt nach 50ms, der 10. Datenpunkt nach 50 + (20 * 10) = 250ms, der 30. Datenpunkt nach 50 + (20 * 30) = 650ms, usw. Das ist ein reiner Test, man kann mit den Zahlen sicherlich weiter spielen.

                                      Jedenfalls funktioniert das Script-Beispiel einwandfrei, es werden damit sauber im Test dann 99 Datenpunkte angelegt und danach was beliebiges ausgeführt (im Beispiel danach dann nur 2 Logzeilen).
                                      Wer will, bitte gerne testen, das Script kann per Copy/Paste übernommen werden, es werden die 99 Datenpunkte dann unter "0_userdata.0.Mic_Test.Datenpunkt_01", "0_userdata.0.Mic_Test.Datenpunkt_02", "0_userdata.0.Mic_Test.Datenpunkt_03" usw. angelegt.
                                      Das Script gibt umfangreiche Log-Zeilen aus, damit kann man alles nachvollziehen.

                                      1 Antwort Letzte Antwort
                                      0
                                      • dslraserD dslraser

                                        @Mic
                                        ich hatte es gestern vor Deinem letzten Beitrag mal für mich mit Deinem "vorletzten" Script probiert. Ich erstelle mir die Datenpunkte für ein Blockly in einem Blockly. Es wird auch alles richtig erstellt, spricht irgendwas dagegen, oder kann man das so machen ? Siehe Spoiler


                                        Bildschirmfoto 2020-01-09 um 19.18.54.png
                                        So habe ich es in der Funktion...

                                        //####################---Fenster Anzahl gekippt-geöffnet-geschlossen-gesamt---####################
                                        createUserDataState('Fenster_zaehlen.01_Anzahl_Fenster_gekippt', {'name':'01_Anzahl_Fenster_gekippt', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                        createUserDataState('Fenster_zaehlen.02_Anzahl_Fenster_offen', {'name':'02_Anzahl_Fenster_offen', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                        createUserDataState('Fenster_zaehlen.03_Anzahl_Fenster_geschlossen', {'name':'03_Anzahl_Fenster_geschlossen', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                        createUserDataState('Fenster_zaehlen.04_Anzahl_Fenster_gesamt', {'name':'04_Anzahl_Fenster_gesamt', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0});
                                        //####################---Fenster offene-gekippte Fenster Liste---####################
                                        createUserDataState('Fenster_zaehlen.05_offene_gekippte_Fenster_Liste', {'name':'05_offene_gekippte_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer'});
                                        //####################---DP gesamte Fenster Liste mit Zustand anlegen---####################
                                        createUserDataState('Fenster_zaehlen.06_gesamte_Fenster_Liste', {'name':'06_gesamte_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer'});
                                        //####################---Fenster Liste iQontrol anlegen---####################
                                        createUserDataState('Fenster_zaehlen.07_iQontrol_Fenster_Liste', {'name':'07_iQontrol_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer'});
                                        //####################---DP Nachrichtenversand Telegram anschalten-ausschalten anlegen---####################
                                        createUserDataState('Nachrichtenversand.Telegram.01Telegram_Nachrichtenversand_Fenster_zaehlen', {'name':'01Telegram_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false});
                                        //####################---DP Nachrichtenversand E-Mail anschalten-ausschalten anlegen---####################
                                        createUserDataState('Nachrichtenversand.EMail.01EMail_Nachrichtenversand_Fenster_zaehlen', {'name':'01EMail_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false});
                                        //####################---Alexa Datenpunkte anlegen---####################
                                        createUserDataState('Nachrichtenversand.EMail.01EMail_Nachrichtenversand_Fenster_zaehlen', {'name':'01EMail_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false});
                                        //####################---Alexa Datenpunkte anlegen---####################
                                        createUserDataState('Alexa_Ansagen.Stimmen.01Alexa', {'name':'01Alexa', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':true, "smartName": {"de": "Alexa","smartType": "SWITCH"}});
                                        createUserDataState('Alexa_Ansagen.Stimmen.02Hans', {'name':'02Hans', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Hans","smartType": "SWITCH"}});
                                        createUserDataState('Alexa_Ansagen.Stimmen.03Vicki', {'name':'03Vicki', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Vicki","smartType": "SWITCH"}});
                                        createUserDataState('Alexa_Ansagen.Stimmen.04Conchita', {'name':'04Conchita', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Conchita","smartType": "SWITCH"}});
                                        createUserDataState('Alexa_Ansagen.Stimmen.05Alexa_ssml', {'name':'05Alexa_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Alexa">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.06Hans_ssml', {'name':'06Hans_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Hans">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.07Vicki_ssml', {'name':'07Vicki_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Vicki">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.08Conchita_ssml', {'name':'08Conchita_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Conchita">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.09ssml_ende', {'name':'09ssml_ende', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice></speak>'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.10Alexa_Stimmenwechsel_ssml', {'name':'10Alexa_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Alexa">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.11Hans_Stimmenwechsel_ssml', {'name':'11Hans_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Hans">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.12Vicki_Stimmenwechsel_ssml', {'name':'12Vicki_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Vicki">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.13Conchita_Stimmenwechsel_ssml', {'name':'13Conchita_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Conchita">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.14fluestern_anfang', {'name':'14fluestern_anfang', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><amazon:effect name="whispered">'});
                                        createUserDataState('Alexa_Ansagen.Stimmen.15fluestern_ende', {'name':'15fluestern_ende', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</amazon:effect></speak>'});
                                        createUserDataState('Alexa_Ansagen.Ansagen.Fensteransage', {'name': 'Fensteransage','type': 'boolean', 'read': false, 'write': true, 'role': 'button','def':false, "smartName": {"de": "Fensteransage","smartType": "SWITCH"}});
                                        
                                        /**
                                         * Creates a state under 0_userdata.0
                                         * Source: https://forum.iobroker.net/topic/26839/
                                         * Thanks to ioBroker forum user "paul53" for the basis of this function.
                                         * Version: 0.1 - Mic
                                         * @param {string} stateId        State ID to be created under '0_userdata.0', like 'LivingRoom.Lights.Sideboard.Brightness'
                                         * @param {object} param          Object with state details. Template: {'name':'NAME', 'type':'number', 'unit':'UNIT', 'min':MIN, 'max':MAX, 'read':true, 'write':true, 'role':'ROLE', 'def':DEFAULT }
                                         * @param {boolean} [warn=false]  Optional. Throws warning in log, if state is already existing. Default is false, so no warning in log, if state exists
                                         */
                                        function createUserDataState(stateId, param, warn) {
                                         
                                            if (warn === undefined) warn = false;
                                            const WHERE = '0_userdata.0';
                                            stateId = (stateId.startsWith(WHERE)) ? stateId.substring(WHERE.length) : stateId; // remove WHERE from beginning of string
                                            stateId = (stateId.startsWith('.')) ? stateId.substring(1) : stateId; // remove first "."
                                         
                                            const FULL_STATE_ID = (WHERE.endsWith('.') ? WHERE : WHERE + '.') + stateId; // Final state
                                         
                                            if($(FULL_STATE_ID).length) {
                                                if(warn) log('State [' + FULL_STATE_ID + '] is already existing and will no longer be created.', 'warn');
                                                return;
                                            }
                                         
                                            let obj = {};
                                            obj.type = 'state';
                                            obj.common = param;
                                            setObject(FULL_STATE_ID, obj, function (err) {
                                                if (err) {
                                                    log('Cannot write object: ' + err);
                                                } else {
                                                    let init = null;
                                                    if(param.def === undefined) {
                                                        if(param.type === 'number') init = 0;
                                                        if(param.type === 'boolean') init = false;
                                                        if(param.type === 'string') init = 'noch leer';
                                                    } else {
                                                        init = param.def;
                                                    }
                                                    setTimeout(function() { setState(FULL_STATE_ID, init, true); }, 1000); // see https://forum.iobroker.net/post/334331
                                                }
                                            });
                                         
                                        }
                                        

                                        MicM Offline
                                        MicM Offline
                                        Mic
                                        Developer
                                        schrieb am zuletzt editiert von
                                        #23

                                        @dslraser sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                                        @Mic
                                        ich hatte es gestern vor Deinem letzten Beitrag mal für mich mit Deinem "vorletzten" Script probiert. Ich erstelle mir die Datenpunkte für ein Blockly in einem Blockly. Es wird auch alles richtig erstellt, spricht irgendwas dagegen, oder kann man das so machen ? Siehe Spoiler

                                        Hi @dslraser
                                        Mit Blockly kenne ich mich leider nicht wirklich aus. Mit dem neuen Script kannst du auch beliebig viele Datenpunkte gleichzeitig anlegen. Wäre cool, wenn du das bei dir mal testen kannst. :-) Kannst einfach das Script ohne Modifikation 1:1 in den JavaScript-Adapter copy/paste übernehmen.

                                        dslraserD 2 Antworten Letzte Antwort
                                        0
                                        • MicM Mic

                                          @dslraser sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                                          @Mic
                                          ich hatte es gestern vor Deinem letzten Beitrag mal für mich mit Deinem "vorletzten" Script probiert. Ich erstelle mir die Datenpunkte für ein Blockly in einem Blockly. Es wird auch alles richtig erstellt, spricht irgendwas dagegen, oder kann man das so machen ? Siehe Spoiler

                                          Hi @dslraser
                                          Mit Blockly kenne ich mich leider nicht wirklich aus. Mit dem neuen Script kannst du auch beliebig viele Datenpunkte gleichzeitig anlegen. Wäre cool, wenn du das bei dir mal testen kannst. :-) Kannst einfach das Script ohne Modifikation 1:1 in den JavaScript-Adapter copy/paste übernehmen.

                                          dslraserD Offline
                                          dslraserD Offline
                                          dslraser
                                          Forum Testing Most Active
                                          schrieb am zuletzt editiert von
                                          #24

                                          @Mic sagte in [Vorlage] Skript: Erstellen von User-Datenpunkten:

                                          Mit Blockly kenne ich mich leider nicht wirklich aus.

                                          In dem Spoiler von oben ist der Inhalt Deines Javascript in der Funktion.

                                          MicM 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

                                          629

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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