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.
    • H
      HeliosFan @paul53 last edited by

      @paul53
      Danke sehr, sowas kann man immer brauchen.

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

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

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

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

        // Datenpunkt unter 0_userdata.0 erstellen
        const idUser = 'EG_Kueche.Rollo.Schaltzeit2';
        const commonUser = { // nicht benötigte Attribute auskommentieren
            type: 'string', 
            read: true, 
            write: false, 
            name: 'Rollo Küche Schaltzeit 2',
            desc: 'Laufzeit Rollo', 
        //    def: 60,
        //    min: 0,     // nur bei Zahlen
        //    max: 200,   // nur bei Zahlen
        //    unit: 's',  // nur bei Zahlen
        //    states: {  // nur bei Zahlen, Logikwerten
        //        0: 'Aus',
        //        1: 'Auto',
        //        2: 'Ein'
        //    },
            role: 'string'
        };
         
        function createDp(id, common) {
            if(!getObject(id)) {
                var obj = {};
                obj.type = 'state';
                obj.common = common;
                setObject(id, obj, function (err) {
                    if (err) log('Cannot write object: ' + err)
                    else {
                        var init = null;
                        if(common.def === undefined) {
                            if(common.type === 'number') init = 0;
                            if(common.type === 'boolean') init = false;
                            if(common.type === 'string') init = 'noch leer';
                        } else init = common.def;
                        setState(id, init, true);
                    }
                });
            }
        }
         
        createDp('0_userdata.0.' + idUser, commonUser);
        
        

        javascript.0	2019-12-03 12:25:40.154	warn	(413) at process._tickCallback (internal/process/next_tick.js:68:7)
        javascript.0	2019-12-03 12:25:40.154	warn	(413) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49)
        javascript.0	2019-12-03 12:25:40.154	warn	(413) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23)
        javascript.0	2019-12-03 12:25:40.154	warn	(413) at (anonymous function).(anonymous function)._0x5c1e98 (/opt/iobroker/node_modules/iobroker.objects-redis/index.js:17:76202)
        javascript.0	2019-12-03 12:25:40.154	warn	(413) at objects.setObject (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1537:21)
        javascript.0	2019-12-03 12:25:40.154	warn	(413) at script.js.18_Test.Objekt_anlegen_2:35:17
        javascript.0	2019-12-03 12:25:40.153	warn	(413) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1404:20)
        javascript.0	2019-12-03 12:25:40.153	warn	(413) State "0_userdata.0.EG_Kueche.Rollo.Schaltzeit2" not found
        

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

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

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

          @dslraser sagte:

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

          Erledigt (s.o.)

          @dslraser sagte:

          mit write: true kommt der zweite angesprochene Fehler nicht.

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

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

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

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

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

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

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

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

                @paul53
                Danke, damit geht es.

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

                  @paul53
                  Vielen Dank für dieses Script!

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

                  Beispielaufruf:

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

                  Die Funktion:

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

                    @Mic
                    noch ein kleiner Hinweis zu

                    setTimeout(function()
                    

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

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

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

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

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

                      'def':false
                      

                      funktioniert es ohne Fehlermeldung.

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

                        @dslraser sagte:

                        Ohne 'def':false funktioniert es ohne Fehlermeldung.

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

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

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

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

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

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

                            @dslraser sagte:

                            und wie muß das dann aussehen ?

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

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

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

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

                              Bildschirmfoto 2020-01-08 um 12.59.22.png

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

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

                                @dslraser sagte:

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

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

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

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

                                  0_userdata.0

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

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

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

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

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

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

                                        @Mic
                                        was macht jetzt counter ?

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

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

                                          dslraser 1 Reply Last reply Reply Quote 1
                                          • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            499
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            16
                                            86
                                            14395
                                            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