Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

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

NEWS

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

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

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

[Vorlage] Skript: Erstellen von User-Datenpunkten

Geplant Angeheftet Gesperrt Verschoben JavaScript
86 Beiträge 16 Kommentatoren 18.5k 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.
  • dslraserD dslraser

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

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

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

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

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

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

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

    dslraserD 1 Antwort Letzte Antwort
    0
    • paul53P paul53

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

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

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

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

      @paul53
      Danke, damit geht es.

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

        @paul53
        Vielen Dank für dieses Script!

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

        Beispielaufruf:

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

        Die Funktion:

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

          @paul53
          Vielen Dank für dieses Script!

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

          Beispielaufruf:

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

          Die Funktion:

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

          @Mic
          noch ein kleiner Hinweis zu

          setTimeout(function()
          

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

          MicM 1 Antwort Letzte Antwort
          0
          • MicM Mic

            @paul53
            Vielen Dank für dieses Script!

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

            Beispielaufruf:

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

            Die Funktion:

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

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

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

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

            'def':false
            

            funktioniert es ohne Fehlermeldung.

            paul53P 1 Antwort Letzte Antwort
            0
            • dslraserD dslraser

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

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

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

              'def':false
              

              funktioniert es ohne Fehlermeldung.

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

              @dslraser sagte:

              Ohne 'def':false funktioniert es ohne Fehlermeldung.

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

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

              dslraserD 1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @dslraser sagte:

                Ohne 'def':false funktioniert es ohne Fehlermeldung.

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

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

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

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

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

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

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

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

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

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

                  @dslraser sagte:

                  und wie muß das dann aussehen ?

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

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

                  dslraserD 1 Antwort Letzte Antwort
                  1
                  • paul53P paul53

                    @dslraser sagte:

                    und wie muß das dann aussehen ?

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

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

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

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

                    Bildschirmfoto 2020-01-08 um 12.59.22.png

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

                    paul53P 1 Antwort Letzte Antwort
                    0
                    • dslraserD dslraser

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

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

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

                      Bildschirmfoto 2020-01-08 um 12.59.22.png

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

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

                      @dslraser sagte:

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

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

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

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

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

                        0_userdata.0

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

                        1 Antwort Letzte Antwort
                        0
                        • dslraserD dslraser

                          @Mic
                          noch ein kleiner Hinweis zu

                          setTimeout(function()
                          

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

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

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

                          MicM 1 Antwort Letzte Antwort
                          0
                          • MicM Mic

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

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

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

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

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

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

                              @Mic
                              was macht jetzt counter ?

                              MicM 1 Antwort Letzte Antwort
                              0
                              • dslraserD dslraser

                                @Mic
                                was macht jetzt counter ?

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

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

                                dslraserD 1 Antwort Letzte Antwort
                                1
                                • MicM Mic

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

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

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


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

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

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

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

                                    Ich habe nun das Script wie folgt modifiziert:

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

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

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

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

                                    1 Antwort Letzte Antwort
                                    0
                                    • dslraserD dslraser

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


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

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

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

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

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

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

                                      dslraserD 2 Antworten Letzte Antwort
                                      0
                                      • MicM Mic

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

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

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

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

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

                                        Mit Blockly kenne ich mich leider nicht wirklich aus.

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

                                        MicM 1 Antwort Letzte Antwort
                                        0
                                        • dslraserD dslraser

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

                                          Mit Blockly kenne ich mich leider nicht wirklich aus.

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

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

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

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

                                          Dein Javascript läuft bei mir sauber durch im Test.

                                          Hier all deine Datenpunkte nun im neuesten Script, sollte ebenso alle sauber anlegen. Probier das mal aus:

                                          //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':'Fenster_zaehlen.01_Anzahl_Fenster_gekippt', 'name':'01_Anzahl_Fenster_gekippt', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0 },
                                              {'id':'Fenster_zaehlen.02_Anzahl_Fenster_offen', 'name':'02_Anzahl_Fenster_offen', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0 },
                                              {'id':'Fenster_zaehlen.03_Anzahl_Fenster_geschlossen', 'name':'03_Anzahl_Fenster_geschlossen', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0 },
                                              {'id':'Fenster_zaehlen.04_Anzahl_Fenster_gesamt', 'name':'04_Anzahl_Fenster_gesamt', 'type':'number', 'read':true, 'write':false, 'role':'number', 'def':0 },
                                              {'id':'Fenster_zaehlen.05_offene_gekippte_Fenster_Liste', 'name':'05_offene_gekippte_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer' },
                                              {'id':'Fenster_zaehlen.06_gesamte_Fenster_Liste', 'name':'06_gesamte_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer' },
                                              {'id':'Fenster_zaehlen.07_iQontrol_Fenster_Liste', 'name':'07_iQontrol_Fenster_Liste', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'noch leer' },
                                              {'id':'Nachrichtenversand.Telegram.01Telegram_Nachrichtenversand_Fenster_zaehlen', 'name':'01Telegram_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false },
                                              {'id':'Nachrichtenversand.EMail.01EMail_Nachrichtenversand_Fenster_zaehlen', 'name':'01EMail_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false },
                                              {'id':'Nachrichtenversand.EMail.01EMail_Nachrichtenversand_Fenster_zaehlen', 'name':'01EMail_Nachrichtenversand_Fenster_zaehlen', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false },
                                              {'id':'Alexa_Ansagen.Stimmen.01Alexa', 'name':'01Alexa', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':true, "smartName": {"de": "Alexa","smartType": "SWITCH"} },
                                              {'id':'Alexa_Ansagen.Stimmen.02Hans', 'name':'02Hans', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Hans","smartType": "SWITCH"} },
                                              {'id':'Alexa_Ansagen.Stimmen.03Vicki', 'name':'03Vicki', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Vicki","smartType": "SWITCH"} },
                                              {'id':'Alexa_Ansagen.Stimmen.04Conchita', 'name':'04Conchita', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false, "smartName": {"de": "Conchita","smartType": "SWITCH"} },
                                              {'id':'Alexa_Ansagen.Stimmen.05Alexa_ssml', 'name':'05Alexa_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Alexa">' },
                                              {'id':'Alexa_Ansagen.Stimmen.06Hans_ssml', 'name':'06Hans_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Hans">' },
                                              {'id':'Alexa_Ansagen.Stimmen.07Vicki_ssml', 'name':'07Vicki_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Vicki">' },
                                              {'id':'Alexa_Ansagen.Stimmen.08Conchita_ssml', 'name':'08Conchita_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><voice name="Conchita">' },
                                              {'id':'Alexa_Ansagen.Stimmen.09ssml_ende', 'name':'09ssml_ende', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice></speak>' },
                                              {'id':'Alexa_Ansagen.Stimmen.10Alexa_Stimmenwechsel_ssml', 'name':'10Alexa_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Alexa">' },
                                              {'id':'Alexa_Ansagen.Stimmen.11Hans_Stimmenwechsel_ssml', 'name':'11Hans_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Hans">' },
                                              {'id':'Alexa_Ansagen.Stimmen.12Vicki_Stimmenwechsel_ssml', 'name':'12Vicki_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Vicki">' },
                                              {'id':'Alexa_Ansagen.Stimmen.13Conchita_Stimmenwechsel_ssml', 'name':'13Conchita_Stimmenwechsel_ssml', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</voice><voice name="Conchita">' },
                                              {'id':'Alexa_Ansagen.Stimmen.14fluestern_anfang', 'name':'14fluestern_anfang', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'<speak><amazon:effect name="whispered">' },
                                              {'id':'Alexa_Ansagen.Stimmen.15fluestern_ende', 'name':'15fluestern_ende', 'type':'string', 'read':true, 'write':false, 'role':'string', 'def':'</amazon:effect></speak>' },
                                              {'id':'XAlexa_Ansagen.Ansagen.Fensteransage', 'name': 'Fensteransage','type': 'boolean', 'read': false, 'write': true, 'role': 'button','def':false, "smartName": {"de": "Fensteransage","smartType": "SWITCH"} },
                                          
                                          ];    
                                          
                                          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 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

                                          395

                                          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