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.3k

  • 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 Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von paul53
    #1
    // 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.

    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

    H dslraserD 2 Antworten Letzte Antwort
    8
    • paul53P 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 Offline
      H Offline
      HeliosFan
      schrieb am zuletzt editiert von
      #2

      @paul53
      Danke sehr, sowas kann man immer brauchen.

      1 Antwort Letzte Antwort
      0
      • paul53P 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.

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

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

        paul53P 1 Antwort Letzte Antwort
        0
        • dslraserD 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.

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

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

          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:

            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
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          657

                                          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