Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Vorlage] Skript: Erstellen von User-Datenpunkten

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    [Vorlage] Skript: Erstellen von User-Datenpunkten

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 last edited by paul53

      // Datenpunkt unter 0_userdata.0 erstellen
      const idUser = 'EG_Kueche.Rollo.Schaltzeit2';
      const commonUser = { // nicht benötigte Attribute auskommentieren
          type: 'number', 
          read: true, 
          write: true, 
          name: 'Rollo Küche Schaltzeit 2',
          desc: 'Laufzeit Rollo', 
          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: 'level.timer'
      };
      
      function createDp(id, common) {
          if(existsState(id)) log('Datenpunkt ' + id + ' existiert bereits !', 'warn');
          else {
              var obj = {};
              obj.type = 'state';
              obj.common = common;
              obj.native = {};
              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 = '';
                      } else init = common.def;
                      setState(id, init, true);
                  }
              });
          }
      }
      
      createDp('0_userdata.0.' + idUser, commonUser);
      

      EDIT: Abfrage geändert, ob Datenpunkt schon vorhanden ist.

      H dslraser 2 Replies Last reply Reply Quote 8
      • H
        HeliosFan @paul53 last edited by

        @paul53
        Danke sehr, sowas kann man immer brauchen.

        1 Reply Last reply Reply Quote 0
        • dslraser
          dslraser Forum Testing Most Active @paul53 last edited by dslraser

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

          Und noch eine zweite Frage. Wenn ich versuche einen DP vom type string zu erstellen hagelt es auch Fehler und angemeckert wird immer die Zeile 35.

          So habe ich es versucht...(die Namen waren mir erstmal egal)

          // Datenpunkt unter 0_userdata.0 erstellen
          const idUser = 'EG_Kueche.Rollo.Schaltzeit2';
          const commonUser = { // nicht benötigte Attribute auskommentieren
              type: 'string', 
              read: true, 
              write: false, 
              name: 'Rollo Küche Schaltzeit 2',
              desc: 'Laufzeit Rollo', 
          //    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(!getObject(id)) {
                  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 12:25:40.154	warn	(413) at process._tickCallback (internal/process/next_tick.js:68:7)
          javascript.0	2019-12-03 12:25:40.154	warn	(413) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
          javascript.0	2019-12-03 12:25:40.154	warn	(413) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
          javascript.0	2019-12-03 12:25:40.154	warn	(413) at (anonymous function).(anonymous function)._0x5c1e98 (/opt/iobroker/node_modules/iobroker.objects-redis/index.js:17:76202)
          javascript.0	2019-12-03 12:25:40.154	warn	(413) at objects.setObject (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1537:21)
          javascript.0	2019-12-03 12:25:40.154	warn	(413) at script.js.18_Test.Objekt_anlegen_2:35:17
          javascript.0	2019-12-03 12:25:40.153	warn	(413) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1404:20)
          javascript.0	2019-12-03 12:25:40.153	warn	(413) State "0_userdata.0.EG_Kueche.Rollo.Schaltzeit2" not found
          

          3.12.2019, 12:30:44.911	[info ]: javascript.0 (413) Stop script script.js.18_Test.Objekt_anlegen_2
          3.12.2019, 12:30:47.151	[info ]: javascript.0 (413) Start javascript script.js.18_Test.Objekt_anlegen_2
          3.12.2019, 12:30:47.155	[info ]: javascript.0 (413) script.js.18_Test.Objekt_anlegen_2: registered 0 subscriptions and 0 schedules
          3.12.2019, 12:30:47.164	[warn ]: javascript.0 (413)     at script.js.18_Test.Objekt_anlegen_2:35:17
          

          Edit: mit write: true kommt der zweite angesprochene Fehler nicht.

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @dslraser last edited by 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.

            dslraser 1 Reply Last reply Reply Quote 1
            • dslraser
              dslraser Forum Testing Most Active @paul53 last edited by

              @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
              
              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @dslraser last edited by

                @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);
                
                dslraser 1 Reply Last reply Reply Quote 0
                • dslraser
                  dslraser Forum Testing Most Active @paul53 last edited by

                  @paul53
                  Danke, damit geht es.

                  1 Reply Last reply Reply Quote 0
                  • Mic
                    Mic Developer last edited by 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
                            }
                        });
                    
                    }
                    
                    dslraser 2 Replies Last reply Reply Quote 1
                    • dslraser
                      dslraser Forum Testing Most Active @Mic last edited by

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

                      Mic 1 Reply Last reply Reply Quote 0
                      • dslraser
                        dslraser Forum Testing Most Active @Mic last edited by

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

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

                          @dslraser sagte:

                          Ohne 'def':false funktioniert es ohne Fehlermeldung.

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

                          dslraser 1 Reply Last reply Reply Quote 0
                          • dslraser
                            dslraser Forum Testing Most Active @paul53 last edited by 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 });
                            
                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @dslraser last edited by 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'});
                              
                              dslraser 1 Reply Last reply Reply Quote 1
                              • dslraser
                                dslraser Forum Testing Most Active @paul53 last edited by

                                @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

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

                                  @dslraser sagte:

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

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

                                  O 1 Reply Last reply Reply Quote 1
                                  • X
                                    xbow42 last edited by xbow42

                                    @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 Reply Last reply Reply Quote 0
                                    • Mic
                                      Mic Developer @dslraser last edited by 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 😞

                                      Mic 1 Reply Last reply Reply Quote 0
                                      • Mic
                                        Mic Developer @Mic last edited by

                                        @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) );
                                                    }
                                                });
                                        
                                            });
                                        }
                                        
                                        dslraser 2 Replies Last reply Reply Quote 2
                                        • dslraser
                                          dslraser Forum Testing Most Active @Mic last edited by

                                          @Mic
                                          was macht jetzt counter ?

                                          Mic 1 Reply Last reply Reply Quote 0
                                          • Mic
                                            Mic Developer @dslraser last edited by

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

                                            dslraser 1 Reply Last reply Reply Quote 1
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            919
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

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