Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Vorlage] Skript: Erstellen von User-Datenpunkten

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

      @dslraser sagte:

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

      Erledigt (s.o.)

      @dslraser sagte:

      mit write: true kommt der zweite angesprochene Fehler nicht.

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

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

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

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

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

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

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

                          setTimeout(function() {setState(id, init, true);}, 100);
          
          dslraser 1 Reply Last reply Reply Quote 0
          • dslraser
            dslraser Forum Testing Most Active @paul53 last edited by

            @paul53
            Danke, damit geht es.

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

              @paul53
              Vielen Dank für dieses Script!

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

              Beispielaufruf:

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

              Die Funktion:

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

                @Mic
                noch ein kleiner Hinweis zu

                setTimeout(function()
                

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

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

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

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

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

                  'def':false
                  

                  funktioniert es ohne Fehlermeldung.

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

                    @dslraser sagte:

                    Ohne 'def':false funktioniert es ohne Fehlermeldung.

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

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

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

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

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

                      createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'string', 'def':false });
                      
                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @dslraser last edited by paul53

                        @dslraser sagte:

                        und wie muß das dann aussehen ?

                        createUserDataState('Test.Teststring', {'name':'Das ist ein Teststring, 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'irgendwas zwischen 2 Hochkommata'});
                        
                        dslraser 1 Reply Last reply Reply Quote 1
                        • dslraser
                          dslraser Forum Testing Most Active @paul53 last edited by

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

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

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

                          Bildschirmfoto 2020-01-08 um 12.59.22.png

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

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

                            @dslraser sagte:

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

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

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

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

                              0_userdata.0

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

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

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

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

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

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

                                    @Mic
                                    was macht jetzt counter ?

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

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

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

                                        @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
                                                }
                                            });
                                         
                                        }
                                        

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

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

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

                                            dslraser 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            905
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

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