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

donate donate
  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.5k

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

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

[Vorlage] Skript: Erstellen von User-Datenpunkten

Geplant Angeheftet Gesperrt Verschoben JavaScript
86 Beiträge 16 Kommentatoren 18.6k Aufrufe 30 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • paul53P paul53
    // 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
                                        • MicM Mic

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

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

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


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

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

                                          MicM 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          794

                                          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