Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. async / await -> Muster Anleitung gesucht

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    async / await -> Muster Anleitung gesucht

    This topic has been deleted. Only users with topic management privileges can see it.
    • AlCalzone
      AlCalzone Developer @bahnuhr last edited by

      @bahnuhr sagte in async / await -> Muster Anleitung gesucht:

      Aber so richtig verstanden habe ich dies nicht.

      Hilft das?
      https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95

      bahnuhr 1 Reply Last reply Reply Quote 1
      • bahnuhr
        bahnuhr Forum Testing Most Active @AlCalzone last edited by

        @alcalzone sagte in async / await -> Muster Anleitung gesucht:

        @bahnuhr sagte in async / await -> Muster Anleitung gesucht:

        Aber so richtig verstanden habe ich dies nicht.

        Hilft das?
        https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95

        Ja, kenn ich.
        Hab ich schon mehrmals gelesen. Ist aber für mich "starker toback".

        mfg
        Dieter

        1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active @liv-in-sky last edited by

          @liv-in-sky sagte in async / await -> Muster Anleitung gesucht:

          die funktion "Datei_kopieren" finde ich nicht im script - ist die unter global ?

          Ja, ist ein globales Script.
          anbei:

          function Datei_kopieren(von, nach) {
              // Pfad immer mit / darstellen
              // als "von" und "nach" den genauen Pfad angeben, z.B. "opt/iobroker/iobroker-data/files/vis.0/Daten/test.txt"
              var fs = require('fs'); 
              const datei= fs.readFileSync(von); 
              setTimeout(function(){
                  fs.writeFileSync(nach, datei);
              }, 500);
          }
          
          1 Reply Last reply Reply Quote 0
          • H
            Hendrick @htrecksler last edited by Hendrick

            @htrecksler said in async / await -> Muster Anleitung gesucht:

            Da ist ja wieder ein Sleep-Befehl? Oder ist der in dem Fall Kosmetik?

            Das war nur Kosmetik, aber war in diesem Fall wohl verwirrend, denn die sleep braucht es nicht.

            @bahnuhr said in async / await -> Muster Anleitung gesucht:

            function Datei_kopieren(von, nach)

            Lass mal mit dieser Funktion anfangen. Diese muss auf async/await umgeschrieben werden.

            Hier ein komplettes Beispiel:

            const fs = require('fs');
            
            
            mainAsync();
            async function mainAsync() {
            
                try {
            
                    /**
                     * Hier kopieren wir die Datei.
                     */
            
                    log(`Trying to copy file...`);
                    const fileSource = '/opt/iobroker/_test1/pic.png';
                    const fileTarget = '/opt/iobroker/_test1/pic-copy.png';
                    
                    const fileCopied = await copyFileAsync(fileSource, fileTarget);
                    if (!fileCopied) {
                        // Beim Kopieren trat ein Fehler auf.
                        log(`Datei '${fileSource}' konnte nicht nach '${fileTarget}' kopiert werden.`, 'warn');
                        log(`Script wird beendet.`, 'warn');
                        return false;
                    }
                    log(`File copied.`);
            
                    /**
                     * Datei erfolgreich kopiert, hier geht's weiter
                     */
                    // HIER GEHT ES WEITER
                    // ...
                    // Setze z.B. jetzt einen Datenpunkt
                    // await setStateAsync('0_userdata.0.test.123.Datei-ist-kopiert', {val:true, ack:false});
            
            
                } catch (error) {
                    dumpError(`[mainAsync()]`, error);
                    return false;
                }
            
            }
            
            
            
            /**
             * Copy file async - https://stackoverflow.com/a/30405105
             * @param {string} source     /path/to/file
             * @param {string} target     /path/to/file
             * @return {Promise<boolean>} true if successful, false if not
             */
            async function copyFileAsync(source, target) {
            
                const rd = fs.createReadStream(source);
                const wr = fs.createWriteStream(target);
            
                try {
            
                    await new Promise( (resolve, reject) => {
                        rd.on('error', reject);
                        wr.on('error', reject);
                        wr.on('finish', resolve);
                        rd.pipe(wr);
                    });
                    return true;
            
                } catch (error) {
                    rd.destroy();
                    wr.end();
                    dumpError(`[copyFileAsync()]`, error);
                    return false;
              }
            
            }
            
            
            /**
             * Error Message to Log. Handles error object being provided.
             * @param {string} msg               - (intro) message of the error
             * @param {*}      [error=undefined] - Optional: Error object or string
             */
            function dumpError(msg, error=undefined) {
                if (!error) {
                    console.error(msg);
                } else {
                    if (typeof error === 'object') {
                        if (error.stack) {
                            log(`${msg} – ${error.stack}`, 'error');
                        } else if (error.message) {
                            log(`${msg} – ${error.message}`, 'error');
                        } else {
                            log(`${msg} – ${JSON.stringify(error)}`, 'error');
                        }
                    } else if (typeof error === 'string') {
                        log(`${msg} – ${error}`, 'error');
                    } else {
                        log(`[dumpError()] : wrong error argument: ${JSON.stringify(error)}`, 'error');
                    }
                }
            }
            

            Zur Erklärung:
            In der Funktion mainAsync() rufst du nach und nach all deine asynchronen Funktionen etc. auf.
            Im Beispiel rufen wir also zunächst copyFileAsync() auf. Sobald erfolgreich kopiert, kannst du dann weitere Funktionen aufrufen, wie z.B. mit await setStateAsync() einen Datenpunkt setzen, usw.

            bahnuhr 1 Reply Last reply Reply Quote 0
            • H
              Hendrick @bahnuhr last edited by

              @bahnuhr said in async / await -> Muster Anleitung gesucht:

              Habt ihr mal ein Muster mit diesem await, das halt wartet bis etwas erledigt ist, und dann zum nächsten await geht.

              @htrecksler said in async / await -> Muster Anleitung gesucht:

              Ich würde die await Funktion auch sehr gerne nutzen, habe mich aber noch nicht weiter damit beschäftigt.

              Ich hatte auch einige Zeit gebraucht, um die async/await Logik zu verstehen 🙂
              Oben hab ich schon mal versucht, zu erklären.
              Weiteres Beispiel:
              In einem Script will ich Datenpunkte anlegen, und danach diese auf Änderung überwachen. Die Überwachung auf Änderung soll aber nur stattfinden, nachdem die Datenpunkte angelegt sind, was mehrere Millisekunden dauern kann mit createState(). Daher bietet sich hier super async/await an.

              mainAsync();
              async function mainAsync() {
              
                  try {
              
                      await createStateAsync('0_userdata.0._0_TEST.STATE_1', {name:'Test 1', type:'string', read:true, write:true, role:'state', def:'neu angelegt' });
                      await createStateAsync('0_userdata.0._0_TEST.STATE_2', {name:'Test 2', type:'boolean', read:false, write:true, role:'button', def:false })
              
                      // States erstellt, jetzt machen wir Subscribe        
                      on({id: ['0_userdata.0._0_TEST.STATE_1', '0_userdata.0._0_TEST.STATE_2'], change:'any', ack:false}, async (obj) => {
                          log(`State '${obj.id}' changed to [${obj.state.val}]`)
                      });        
              
              
                  } catch (error) {
                      dumpError(`[mainAsync()]`, error);
                      return false;
                  }
              
              }
              
              
              /**
               * Error Message to Log. Handles error object being provided.
               * @param {string} msg               - (intro) message of the error
               * @param {*}      [error=undefined] - Optional: Error object or string
               */
              function dumpError(msg, error=undefined) {
                  if (!error) {
                      console.error(msg);
                  } else {
                      if (typeof error === 'object') {
                          if (error.stack) {
                              log(`${msg} – ${error.stack}`, 'error');
                          } else if (error.message) {
                              log(`${msg} – ${error.message}`, 'error');
                          } else {
                              log(`${msg} – ${JSON.stringify(error)}`, 'error');
                          }
                      } else if (typeof error === 'string') {
                          log(`${msg} – ${error}`, 'error');
                      } else {
                          log(`[dumpError()] : wrong error argument: ${JSON.stringify(error)}`, 'error');
                      }
                  }
              }
              
              bahnuhr 1 Reply Last reply Reply Quote 2
              • bahnuhr
                bahnuhr Forum Testing Most Active @Hendrick last edited by

                @hendrick

                Danke erst einmal von mir.
                Ich muss mir dies mal anschauen.

                Wenn noch jemand Beispiele hat nur her damit.

                H 1 Reply Last reply Reply Quote 0
                • H
                  Hendrick @bahnuhr last edited by

                  @bahnuhr said in async / await -> Muster Anleitung gesucht:

                  Wenn noch jemand Beispiele hat nur her damit.

                  Melde dich einfach, wenn du wo hängst. Ich denke das mit createStateAsync() ist ein gutes Beispiel.

                  Du kannst das auch in eine Funktion kapseln, also:

                  mainAsync();
                  async function mainAsync() {
                  
                      try {
                  
                          const createStateResult = await createSomeStates();
                          if (createStateResult) {
                              log('States erfolgreich erstellt, wir machen weiter.');
                          } else {
                              log('Fehler bei State-Erstellung. Wir brechen ab', 'warn');
                              return;
                          }
                  
                          // States erstellt, jetzt machen wir Subscribe        
                          on({id: ['0_userdata.0._0_TEST.STATE_1', '0_userdata.0._0_TEST.STATE_2'], change:'any', ack:false}, async (obj) => {
                              log(`State '${obj.id}' changed to [${obj.state.val}]`)
                          });        
                  
                  
                      } catch (error) {
                          dumpError(`[mainAsync()]`, error);
                          return false;
                      }
                  
                  }
                  
                  
                  /**
                   * @return {Promise<boolean>}
                   */
                  async function createSomeStates() {
                  
                      try {
                  
                          await createStateAsync('0_userdata.0._0_TEST.STATE_1', {name:'Test 1', type:'string', read:true, write:true, role:'state', def:'neu angelegt' });
                          await createStateAsync('0_userdata.0._0_TEST.STATE_2', {name:'Test 2', type:'boolean', read:false, write:true, role:'button', def:false })
                  
                          return true;
                  
                      } catch (error) {
                          dumpError(`[createSomeStates()]`, error);
                          return false;
                      }
                  
                  }
                  
                  
                  
                  
                  
                  /**
                   * Error Message to Log. Handles error object being provided.
                   * @param {string} msg               - (intro) message of the error
                   * @param {*}      [error=undefined] - Optional: Error object or string
                   */
                  function dumpError(msg, error=undefined) {
                      if (!error) {
                          console.error(msg);
                      } else {
                          if (typeof error === 'object') {
                              if (error.stack) {
                                  log(`${msg} – ${error.stack}`, 'error');
                              } else if (error.message) {
                                  log(`${msg} – ${error.message}`, 'error');
                              } else {
                                  log(`${msg} – ${JSON.stringify(error)}`, 'error');
                              }
                          } else if (typeof error === 'string') {
                              log(`${msg} – ${error}`, 'error');
                          } else {
                              log(`[dumpError()] : wrong error argument: ${JSON.stringify(error)}`, 'error');
                          }
                      }
                  }
                  
                  1 Reply Last reply Reply Quote 0
                  • bahnuhr
                    bahnuhr Forum Testing Most Active @Hendrick last edited by

                    @hendrick
                    Hallo,
                    habe dein Script mal probiert mit einer ts Datei, Größe 480 MB
                    Und ein paar logs eingebaut.

                    const fs = require('fs');
                     
                     
                    log ("start");
                    begin();
                    
                    function begin() {
                        mainAsync();
                        log ("Punkt 1")
                    }
                    
                    
                    async function mainAsync() {
                     
                        try {
                     
                            /**
                             * Hier kopieren wir die Datei.
                             */
                     
                            log(`Trying to copy file...`);
                            const fileSource = "/opt/iobroker/iobroker-data/files/vis.0/James.ts";
                            const fileTarget = "/mnt/Jam.ts";
                            
                            const fileCopied = await copyFileAsync(fileSource, fileTarget);
                            if (!fileCopied) {
                                // Beim Kopieren trat ein Fehler auf.
                                log(`Datei '${fileSource}' konnte nicht nach '${fileTarget}' kopiert werden.`, 'warn');
                                log(`Script wird beendet.`, 'warn');
                                return false;
                            }
                            log(`File copied.`);
                            await weiter();
                    
                            /**
                             * Datei erfolgreich kopiert, hier geht's weiter
                             */
                            // HIER GEHT ES WEITER
                            // ...
                            // Setze z.B. jetzt einen Datenpunkt
                            // await setStateAsync('0_userdata.0.test.123.Datei-ist-kopiert', {val:true, ack:false});
                     
                     
                        } catch (error) {
                            dumpError(`[mainAsync()]`, error);
                            return false;
                        }
                     
                    }
                     
                    function weiter(){
                        log ("Punkt 2")
                    }
                    
                    
                    
                     
                    /**
                     * Copy file async - https://stackoverflow.com/a/30405105
                     * @param {string} source     /path/to/file
                     * @param {string} target     /path/to/file
                     * @return {Promise<boolean>} true if successful, false if not
                     */
                    async function copyFileAsync(source, target) {
                     
                        const rd = fs.createReadStream(source);
                        const wr = fs.createWriteStream(target);
                     
                        try {
                     
                            await new Promise( (resolve, reject) => {
                                rd.on('error', reject);
                                wr.on('error', reject);
                                wr.on('finish', resolve);
                                rd.pipe(wr);
                            });
                            return true;
                     
                        } catch (error) {
                            rd.destroy();
                            wr.end();
                            dumpError(`[copyFileAsync()]`, error);
                            return false;
                      }
                     
                    }
                     
                     
                    /**
                     * Error Message to Log. Handles error object being provided.
                     * @param {string} msg               - (intro) message of the error
                     * @param {*}      [error=undefined] - Optional: Error object or string
                     */
                    function dumpError(msg, error=undefined) {
                        if (!error) {
                            console.error(msg);
                        } else {
                            if (typeof error === 'object') {
                                if (error.stack) {
                                    log(`${msg} – ${error.stack}`, 'error');
                                } else if (error.message) {
                                    log(`${msg} – ${error.message}`, 'error');
                                } else {
                                    log(`${msg} – ${JSON.stringify(error)}`, 'error');
                                }
                            } else if (typeof error === 'string') {
                                log(`${msg} – ${error}`, 'error');
                            } else {
                                log(`[dumpError()] : wrong error argument: ${JSON.stringify(error)}`, 'error');
                            }
                        }
                    }
                    
                    

                    Hiersieht man, dass "file copied" und "Punkt 2" schon nach 4 Sek. kommt.
                    9f6519f5-0362-4623-b855-e41382df690a-image.png

                    Wenn ich dann aber im win.Explorer nachschaue wird die Datei noch kopiert (MB zählt nach oben).

                    Folglich scheint die Kopie doch noch nicht fertig zu sein.
                    Oder ich versteht dies falsch und hab irgendwo einen Denkfehler.

                    mfg
                    Dieter

                    H 1 Reply Last reply Reply Quote 0
                    • H
                      Hendrick @bahnuhr last edited by

                      @bahnuhr

                      Gute Frage.
                      Die async/await-Abarbeitung im Script ist sauber.

                      Hier nur kleine Anmerkung:
                      Du ruft die Funktion "weiter()" per await weiter(); auf, allerdings ist diese Funktion "weiter()" nicht async definiert. Hat so jetzt keine Auswirkung im Script, aber besser machst du statt function weiter() ein async function weiter(), weil du mit await weiter(); implizierst, dass eine async Funktion aufgerufen wird, was ja so nicht der Fall ist.

                      Jetzt aber zur Thematik:
                      Ich habe das jetzt nicht mit einem großen File getestet. Aber so wie sich der Code in copyFileAsync() liest, wird mittels wr.on('finish', resolve); erst dann ein erfolgreiches Schreiben zurückgemeldet, wenn der Prozess abgeschlossen ist.
                      Somit wundert es mich, dass du vorher schon die Rückmeldung bekommst.
                      Du könntest das mal überprüfen, in dem du im Script die Dateigröße der Quelle mit der Dateigröße des Ziels vergleichst in deiner Funktion weiter() und diese als Log mal ausgibst. Dann weißt du, ob lt. Script wirklich kopiert wurde.

                      Lange Rede, kurzer Sinn: dies hat nichts mit dem Script-Aufbau zu async/await zu tun, sondern könnte bei dir fs.createWriteStream() schon vorzeitig ein finish liefern, obwohl noch gar nicht fertig kopiert wurde.
                      Seltsam, aber wäre es wert, näher einzusteigen.

                      bahnuhr 2 Replies Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active @Hendrick last edited by

                        @hendrick sagte in async / await -> Muster Anleitung gesucht:

                        diese als Log mal ausgibst.

                        Hast du da mal ein Scriptschnipsel.

                        Danke, ich werds dann probieren.

                        Fazit:
                        Das ganze ist verdammt verwirrend und irreführend für mich.

                        Wenn ich mir das Script so anschaue, dann sind das nur für den kopier Befehl ca. 30 Zeilen (ohne sie jetzt genau gezählt zu haben).
                        Mein derzeitiges kopier-Script hat 3 Zeilen + timeout Zeilen.

                        H 1 Reply Last reply Reply Quote 0
                        • bahnuhr
                          bahnuhr Forum Testing Most Active @Hendrick last edited by

                          @hendrick sagte in async / await -> Muster Anleitung gesucht:

                          Du ruft die Funktion "weiter()" per await weiter();

                          Ja, aber nur weil du im Beispiel den:
                          await setStateAsync('0_userdata.0.test.123.Datei-ist-kopiert', {val:true, ack:false});
                          auch mit await aufgerufen hast.

                          Wusste nicht, dass da ein Unterschied besteht.

                          H 1 Reply Last reply Reply Quote 0
                          • H
                            Hendrick @bahnuhr last edited by

                            @bahnuhr said in async / await -> Muster Anleitung gesucht:

                            Fazit:
                            Das ganze ist verdammt verwirrend und irreführend für mich.
                            Wenn ich mir das Script so anschaue, dann sind das nur für den kopier Befehl ca. 30 Zeilen (ohne sie jetzt genau gezählt zu haben).
                            Mein derzeitiges kopier-Script hat 3 Zeilen + timeout Zeilen.

                            Achtung ☺

                            Ich, und wohl jeder hier, erklären dir gerne alles. Sag weiterhin gerne Bescheid, wo du konkret Fragen hast.

                            Viele Script-Beispiele hier im Forum sind "Quick&Dirty", aber funktionieren halt einfach 🙂

                            Einstieg in async/await bedeutet auch, dass du DEUTLICH besseren Quellcode bekommst. Im Idealfall verifizierst da z.T. auch mehr, und wirst mehr diszipliniert, zu prüfen.

                            Beispiel:

                            setState('XYZ', getState('ABC').val);
                            

                            Hier wird einfach so ein Datenpunktwert ohne Prüfung in einen anderen Datenpunkt gesetzt. Egal, ob der DP überhaupt vorhanden ist, egal, ob der Ziel-Datenpunkt kompatibel ist zum Datentyp, etc.

                            Im Idealfall wartet man hier erst mal ab, ob und was der getState() überhaupt zurück liefert, und reagiert dann.
                            cf33cfef-cfd9-4e9a-8821-f59d19dd7a01-image.png

                            Das hat jetzt nicht unbedingt mit async/await zu tun, aber Prüfungen usw. verlängeren den Quellcode, aber ersparen dir viel Ärger in der Zukunft.

                            Auch die Nutzung von try/error wie in den obigen Beispielen.

                            JA - Quellcode wird deutlich länger. Aber auch deutlich sicherer.

                            1 Reply Last reply Reply Quote 0
                            • H
                              Hendrick @bahnuhr last edited by

                              @bahnuhr said in async / await -> Muster Anleitung gesucht:

                              @hendrick sagte in async / await -> Muster Anleitung gesucht:

                              Du ruft die Funktion "weiter()" per await weiter();

                              Ja, aber nur weil du im Beispiel den:
                              await setStateAsync('0_userdata.0.test.123.Datei-ist-kopiert', {val:true, ack:false});
                              auch mit await aufgerufen hast.

                              Wusste nicht, dass da ein Unterschied besteht.

                              setStateAsync() ist bereits eine asynchrone Funktion von ioBroker.
                              Um async zu nutzen, rufst du diese per await setStateAsync() auf.

                              weiter() ist deine eigene Funktion, nicht von ioBroker, und nicht von node.js oder einem Modul, hier musst du dieser Funktion selbst sagen, dass sie async ist, in dem du ein async function weiter() machst. Sonst ist sie nicht async und wird einfach so abgefeuert, und es wird auf kein Ergebnis gewartet.

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

                                @hendrick
                                Ich beschäftige mich aktuell auch gerade mit diesem Thema und hänge mich hier mal drann, ich hoffe das ist okay.

                                Bisher arbeite ich fast ausschließlich mit Blockly, und erstelle mit einer Javascript Funktion meine benötigten Datenpunkte. Hier im Blockly können Variablen auf true/false gestellt werden, dann werden die benötigten Datenpunkte erstellt oder bei Abwahl auch wieder gelöscht, falls die existieren. Das hat lange so funktioniert, geht nun aber nicht mehr bzw. manchmal nicht mehr. Es wird angeblich ein DP nicht gefunden, der ist aber da, das endet dann immer im Absturz der Instanz. (Fehlermeldung reiche ich nach)
                                Ziel ist es alle benötigten Datenpunkte zu erstellen oder zu löschen, erst wenn das fertig ist soll die Funktion main() aufgerufen werden, darin befindet sich das eigentliche Blockly.

                                host.iobroker	2021-12-16 19:47:27.171	info	Restart adapter system.adapter.javascript.0 because enabled
                                host.iobroker	2021-12-16 19:47:27.171	error	instance system.adapter.javascript.0 terminated with code 6 (UNCAUGHT_EXCEPTION)
                                host.iobroker	2021-12-16 19:47:27.171	error	Caught by controller[1]: at processImmediate (internal/timers.js:466:21)
                                host.iobroker	2021-12-16 19:47:27.171	error	Caught by controller[1]: at Immediate.<anonymous> (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1965:33)
                                host.iobroker	2021-12-16 19:47:27.171	error	Caught by controller[1]: at setStateHelper (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:390:30)
                                host.iobroker	2021-12-16 19:47:27.171	error	Caught by controller[1]: at Object.<anonymous> (/opt/iobroker/node_modules/iobroker.javascript/lib/tools.js:83:39)
                                host.iobroker	2021-12-16 19:47:27.171	error	Caught by controller[1]: Error: State "javascript.0.Geraete_zaehlen.Steckdosen.Haus.01_Anzeigen_und_Listen.04_eingeschaltete_Steckdosen_Liste" not found
                                host.iobroker	2021-12-16 19:47:27.170	error	Caught by controller[0]: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejecte
                                javascript.0	2021-12-16 19:47:26.541	warn	(27359) Terminated (UNCAUGHT_EXCEPTION): Without reason
                                javascript.0	2021-12-16 19:47:26.541	info	(27359) terminating
                                

                                Variablen und der Inhalt der Funktion bisher:

                                Bildschirmfoto 2021-12-16 um 19.21.33.png

                                async function createUserStates(where, statesToCreate) {
                                  let dp, idKey;
                                  for(let key of statesToCreate){
                                  	idKey = where + '.' + key[0];
                                      dp = key[1];
                                  	if (!(await existsStateAsync(idKey))) {
                                  		await createStateAsync(idKey, dp);
                                  	}
                                  }
                                }
                                
                                //let iqontrol_vorhanden =  'system.adapter.iqontrol'; //prüfen ob iqontol installiert ist
                                //let iot_vorhanden =  'system.adapter.iot'; //prüfen ob iot installiert ist
                                
                                //#####################################################################################################################################################################################################################################################################################################################################################################################
                                
                                //Ansage Button Steckdosenansage anlegen
                                if (Alexa_Ansage_verwenden == true && Steckdosen_verwenden == true){
                                let statesToCreate = [
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.04_Alexa.01_Alexa_Routinebutton', {'name': '01_Alexa_Routinebutton','type': 'boolean', 'read': false, 'write': true, 'role': 'button','def':true, "smartName": {"de": 'Steckdosenansage '+[etage],"smartType": "SWITCH"} }], 
                                ];
                                await createUserStates(anlegen_in, statesToCreate)};
                                
                                //Steckdosen  Datenpunkte anlegen
                                if (Steckdosen_verwenden == true){
                                let statesToCreate = [
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.01_Steckdosen_Anzahl_gesamt', {'name':'01_Steckdosen_Anzahl_gesamt', 'type':'number', 'read':true, 'write':false, 'role':'value', 'unit': 'Steckdosen', 'def':0 }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.02_Steckdosen_Anzahl_eingeschaltet', {'name':'02_Steckdosen_Anzahl_eingeschaltet', 'type':'number', 'read':true, 'write':false, 'role':'value', 'unit': 'Steckdosen', 'def':0 }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.03_Steckdosen_Anzahl_ausgeschaltet', {'name':'03_Steckdosen_Anzahl_ausgeschaltet', 'type':'number', 'read':true, 'write':false, 'role':'value', 'unit': 'Steckdosen', 'def':0 }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.04_eingeschaltete_Steckdosen_Liste', {'name': '04_eingeschaltete_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'noch leer' }],    
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.05_gesamte_Steckdosen_Liste', {'name': '05_gesamte_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'noch leer' }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.06_html_Steckdosen_Liste', {'name':'06_html_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'html', 'def':'noch leer' }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.07_Steckdosen_Liste_mit_Emojis', {'name':'07_Steckdosen_Liste_mit_Emojis', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'noch leer' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.08_Steckdosen_Emoji_eingeschaltet', {'name':'08_Steckdosen_Emoji_eingeschaltet', 'type':'mixed', 'read':true, 'write':true, 'role':'mixed' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.09_Steckdosen_Emoji_ausgeschaltet', {'name':'09_Steckdosen_Emoji_ausgeschaltet', 'type':'mixed', 'read':true, 'write':true, 'role':'mixed' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.10_html_nur_eingeschaltete_Steckdosen_Liste', {'name':'10_html_nur_eingeschaltete_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'html', 'def':'noch leer' }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.Version', {'name':'Version', 'type':'string', 'read':false, 'write':false, 'role':'text', 'def':'' }],   
                                   ///////////////////////////////////
                                   // iQontrol Trigger und Schalter //
                                   /////////////////////////////////// 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.01_Thema_hell_Steckdosen_Liste', {'name':'01_Thema_hell_Steckdosen_Liste', 'type':'boolean', 'read':true, 'write':true, 'role':'switch','def':true}],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.02_Thema_dunkel_Steckdosen_Liste', {'name':'02_Thema_dunkel_Steckdosen_Liste', 'type':'boolean', 'read':true, 'write':true, 'role':'switch','def':false}],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.03_Thema_eigenes_Steckdosen_Liste', {'name':'03_Thema_eigenes_Steckdosen_Liste', 'type':'boolean', 'read':true, 'write':true, 'role':'switch','def':false}],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.04_Trigger_Tabelle_iQontrol_Steckdosen_Liste', {'name': '04_Trigger_Tabelle_iQontrol_Steckdosen_Liste','type': 'boolean', 'read': false, 'write': true, 'role': 'button','def':true}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.05_Schalter_fuer_Button_Tabelle_Steckdosen_Liste', {'name': '05_Schalter_fuer_Button_Tabelle_Steckdosen_Liste','type': 'boolean', 'read': true, 'write': true, 'role': 'switch','def':false}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.06_Trigger_Farbe_iQontrol_Steckdosen_Liste', {'name': '06_Trigger_Farbe_iQontrol_Steckdosen_Liste','type': 'boolean', 'read': false, 'write': true, 'role': 'button','def':true}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.07_Umschalter_Farbe_Steckdosen_Liste', {'name': '07_Umschalter_Farbe_Steckdosen_Liste','type': 'number', 'read': true, 'write': false, 'role': 'value','def':0}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.08_Geraetestatus_in_Ueberschrift_an_aus', {'name': '08_Geraetestatus_in_Ueberschrift_an_aus','type': 'boolean', 'read': true, 'write': true, 'role': 'switch','def':true}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.09_Geraete_in_HTML_Liste_schaltbar', {'name': '09_Geraete_in_HTML_Liste_schaltbar','type': 'boolean', 'read': true, 'write': true, 'role': 'switch','def':true}], 
                                   ///////////////////////////////////////////////
                                   // HTML Daten Hell-Dunkel nicht beschreibbar //
                                   ///////////////////////////////////////////////
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.01_Hintergrundfarbe_Steckdosen_Liste', {'name':'01_Hintergrundfarbe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'white' }],       
                                   //Rahmen Kopf
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.02_Rahmenbreite_Kopf_Steckdosen_Liste', {'name':'02_Rahmenbreite_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.03_Rahmenstyle_Kopf_Steckdosen_Liste', {'name':'03_Rahmenstyle_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'solid' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.04_Rahmenfarbe_Kopf_Steckdosen_Liste', {'name':'04_Rahmenfarbe_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],   
                                   //Rahmen Überschrift
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.05_Rahmenbreite_Ueberschrift_Steckdosen_Liste', {'name':'05_Rahmenbreite_Ueberschrift_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.06_Rahmenstyle_Ueberschrift_Steckdosen_Liste', {'name':'06_Rahmenstyle_Ueberschrift_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'solid' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.07_Rahmenfarbe_Ueberschrift_Steckdosen_Liste', {'name':'07_Rahmenfarbe_Ueberschrift_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],   
                                   //Rahmen Tabelle aussen
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.08_Rahmenbreite_Tabelle_aussen_Steckdosen_Liste', {'name':'08_Rahmenbreite_Tabelle_aussen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'5' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.09_Rahmenstyle_Tabelle_aussen_Steckdosen_Liste', {'name':'09_Rahmenstyle_Tabelle_aussen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'solid' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.10_Rahmenfarbe_Tabelle_aussen_Steckdosen_Liste', {'name':'10_Rahmenfarbe_Tabelle_aussen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],   
                                   //Ueberschrift
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.11_Ueberschrift_Schriftgroesse_Steckdosen_Liste', {'name':'11_Ueberschrift_Schriftgroesse_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'4' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.12_Ueberschrift_Farbe_Steckdosen_Liste', {'name':'12_Ueberschrift_Farbe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],       
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.13_Ueberschrift_Schriftart_Steckdosen_Liste', {'name':'13_Ueberschrift_Schriftart_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'apple' }],           
                                   //Bild links
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.14_Bild_links_Steckdosen_Liste', {'name':'14_Bild_links_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':' data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAIyUlEQVR4Xu2di5EcNRBA+yIAIgAiAEcAjsA4AiACIAJwBEAE4AjMRQCOABMBJgIgAqi3tdrS6iR1a9Sj1cyNqrbO5dW2pH5St/66k22ET87Z/DT5m8v9PyLy5vxF+PcfIsK/pw93E+fwAxH5SUQChN6sBjjA+k1EXs8IaWYgv4vIx70UlN8Dhs991KpWTrIu3gokmAyvzGomhFbxq1diRjlvReQHEXl5y5ZTA+JtMlK9YEK+E5EfMwr74myujLp0j/bzGQytZ2ioAflTRICydnguIr8kidyiheTKCZAXZ7PmoYdgaf4SEVrkg1ACMlIhONfUcb8rIn97aMBJRi+Yr87mMM4OMqmMV72/EpCvReR7p8JoYqgpH2YiYc8pyEwBJX5Zqt2FjNYqN5YBKJdQAvKZiLwaqIlSPvAl5IUWQwg2na5raVxB3NA74y9m9yPHstR8Xy4ZlP6skv5V2UuKoCB0O0cFa2+vJz/UVMrF35qCrGlYWwvxar3UJ3GXu6YIehqfW3PXGW8EkDSLtDzg0ArfWZh/Wss3IoKuSkED8jTuNGiKILN8tIBZeF+LZG22HXKW/pQy4jeXmja67/TGcsEViKWAmAEGccHOW36TxtEqxhKZS35DWQCzxDLQSmgtqW8bCsQDBoqbBUiAiCmj1rfOUNDZwATFUIYB8YIxI5AABj9D97vFHKdQhgDxhDEzkACmdUwUQ1kdSCsMJus0mzybycr5H8wYYwprjyxA4Tc109fUy0ozhuPGgVunxel5YIv/UzzsFoBQBMqvKTguKlAoW6331gXEukbx77m3EvrnewESlO05RlsMhNU7y5gEGDTvsIxKIfYGhDK1+pWSkVgExDq3lYOxVyCUy2PdphkIdpO1EcvA70p4VCX22EJC8XqhNANh1pcWogWmpUtzOnsG0mu+moBY10VCb6oEbe9AKPdSR28GYjVVuRW/FMxjAIK+GAS2TlCagTB++FaxU6wNMybRNqFtEQirlViItfcVmICQCcYcmiO/WlypwNsaEKup1vyq5XsTEIs9ZPsOGbeEGhBa2dq10JLHOI51ANwqNxdfBYJy6ObWAuMN4mmmKshgI0NpxtTigzwK3iJDa9EtsrS4KhBL62AhhpGqNdRMQGnsYpW9RryRQN6LK3Y6qWfpWbEN1Dq5GCsrXSZFDh2HdJPcGgpulcm0T2tvqTUN4mNprvx0CsQy6qwNAJdkasbfWKeKevP+wNKkQDRnNqMD7lVK6fdhGbd3A0cqP2wjxeQ/sA4xEMterFbfsZaydis3BqINBFt7VrtV2poFi4Fo5oqlWMt6yJr53b3sAMSy2zx3bGD3ChpdwABE61096J6NzuhjSS8A0QaDh7nyrRFhRz4dKWaIL0f8AhDttNRjGHv4qrwsLTdrwRQUMxZvAhBtqoADNdkjWKNKsZN0aod3TgeXAKIdXzv8h19t0IYWTwGiOfQZZ2P9VDRWkgbkBUC0SC3rHmOLt73UNF2fgGibgQ+H7gdeA3JvATLjeoWfisZK0vz16wPIhEC0OSzrRoaxRdtmaqYWoo1BtnJUYAuINCBvUfYBZBxKdc3pADIOBilpLeTk1I8WMg7KAWScrk0pmYBoW16u9g2Zkj0ilTSg7WY5xiGD6442Un95DAzHEtEWAk2Ti9phnLFF2nZq2rzhc8ts7wHErxJoPdonANEczQHEB4jlVMEdQLSIx25FHyDaQuBpE3uYpyrdC3jsVvSBgRTNoZ929sQb5eiShevuAIEDYofEsbnBBwrX3taOCJ4WAo+ZXB9la1K0ETq/P+3sOYBoqvT5XrsX5XII6gDio3BNirYR8bKR5ACiqbL/e613RQqXfQsHkH6FaxK48K32KM3VqbQSEAaL3GTACpd2eYCWofh7emx8PF8caEl/dFxtjEd+rgbeOSCjbjF4DOdNtLHHpXcVakoOiNZf9qplrMOwo2W2gHnhjpdgZsgnis09PFPLu7p+fn5q6erqqxSIpYl5KnA2H1YbL7ROIWm+Az0+sBKpQiwDmD0DqU2Pl945yenDosfsJvZbAll6I4RnhUhlaeba2qK1ccdVVzfOxC2BzLiJW1uvsADRRuXov3jE4xZA6HczkVl7c2PNVlCT3QvEYqqKrYMvPIBgdxlp7iH0ALFc3FNtHV5AkENtxwRtPfQAsdzeyrIG3eHikoZHCwkQZvQJrRVkKRDrrd9q19kTSNU2tmrmRvGXANH2WoWimM5qegOxPJJ1I12bkm0FYpnJJWHzUrg3kK2brxYgVhjoxDxvtxYQMrFFn2IFwiuo1htZVb/RMzBkdE2w3kdYe07OZEMGR9KAsPEcGNZrqprviGltITgmMsMMqPXpn+wjvIMVbU1OA0K5rReALpoaWgIkPGGKoq1QcPbY0eHvk1tJnONpQKzigIGerPcaX+QuBYKAcLWQFUoYQOYeX7QWdO14HkAWw6BwPUCWQqHWMAFXeqp0baXX5PcC6YLhAQQZLGqxFdXq6INCmD7A6eP4Zgk9QLpheAFBTutzcjEAwIQl0mab60yyB4jFP1JWKmAxbq/JSvVhWQso6RAYtDQ+986KtorrAWJNg3jFIx4pEG1h3jIfw6I9Nb7F2aeFAQ61CDikOWrD9ygglI8xzYOQWwGrZco60MGEAeVZS7WpxKUAjAHCJwYEsDSQfvBpYfcI/xdMRsk0jgJCfrO3LOWAlM6KFIVUFOnRWpyYXsQAg+1HuVbHdz0tuyWvZiA5B81sJf6BXlFrQB7zPnxGFVbLIz4q9xSgdihTk9vyffb8f23Rnu5seIrI0oPQMgMYoGovR2tyPL4vbenRzlt6pI0M8yYHrwRrcoBMawmntUakafWfxCNvWIK1WjOtk7Jn/ZhlW8uaCktf3VkzrVi25epbWrR1ItGS79Axqca9NZCQOQqOueDTOuK3KCONM+1Nq7MAiRVGzQQM3VU+pdfdloDgN1WTsVSo1+9mBJIrG2BCJyM+/BKPN+LfXS63j6YpcmMYLz26yfkfhpb+InJlFhsAAAAASUVORK5CYII='}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.15_Bild_links_Hoehe_Steckdosen_Liste', {'name':'15_Bild_links_Hoehe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'8' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.16_Bild_links_Breite_Steckdosen_Liste', {'name':'16_Bild_links_Breite_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'8' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.17_Bild_links_Abstand_links_Steckdosen_Liste', {'name':'17_Bild_links_Abstand_links_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.18_Bild_links_Abstand_oben_Steckdosen_Liste', {'name':'18_Bild_links_Abstand_oben_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.19_Bild_links_Abstand_unten_Steckdosen_Liste', {'name':'19_Bild_links_Abstand_unten_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.20_Bild_links_Abstand_rechts_Steckdosen_Liste', {'name':'20_Bild_links_Abstand_rechts_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   //Bild rechts
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.21_Bild_rechts_Steckdosen_Liste', {'name':'21_Bild_rechts_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':' data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAAUVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcqRVCAAAAGnRSTlMAECAwP0BQYG9wf4CPkJ+gr7C/wM/Q3+Dv8DtSRt8AAAMESURBVGje7ZndkqMgEEbBhIzEmfgvet7/QfdCM7uKBlBi1Val79JWOEIj/XUjxMc+dobJtOqIYl2VynXGvSei9fe1aRREtsKeTHQGFEtGBmB0Eie6iTYA2WKxeqCVETdRC/TzATVgZNStOgB65qotz2HTQDnzdEASF5IA3cwDEPvbtsb8QP5TyPX+GI/prnrcr2+AyLRaHk2bx/lOiNo4PgsVDaKq7ZO2UlEg8vEc0ORaJUIIkSidm6f3IY9DblO+bJdpINHtlANvRyHf40D16qqoenz6fQgy5eR2c+FVu71knhDZgCsHaAAauRcyMszl9Td3MRsUP0iBV06WLcBjH+QHz7w/Un72QG54a4uRcguHyD5AW0hjaxMfSA5w8T3WLwB5KEQRpl80gAqEVEAbkqJaoAqDKPvFHGb/wwkpgTos29ZLMeeCyOCJTFORARAdGhEhhDDAVwBklzTWiyV2QdgjjZOVQV5AFGDChZaZB9IByezP18fyeXHlgOT7qhU9fzcHpJ7POym6rlgJ0dKv5pF3QOYlUdID9BbF8i/KHgdk/qscJUm5hNj+V6M4Hk/Cq1tCbP8ByDDpxyXE9h+AvGm5zDzwA8BgB37pT17Ny7mFS2PKtS288Idt4VM+xlOOFbW2Y93WBR2Qpxz15yQtDTR7Visk/Z4iJERpSTWnVaGS6BxxJ+rQqDSWHIwvuLM9gntP6fATXgQNQOdbBHXAEF4EjeVc41fONWv7xL8w9aGMjGxfiZ37UUZGvrdZ0AJ0rmZBt1Em+7Y9xs5J+oqRslWKezdwRrHQbDdwxu5LfqCB84z+VoPu2dLLDjfVJnnVpcumWjpdgA0qQnsw/70Oe6TXsT14TR+/V2x5hPbgPw26NavjNDqFEEKV64gyXstWCCHklzWd+itu83maT5bXBsDUeebOaJ+rjQ/kb2n2hitAYymgt19m6gDV4Kkteuu95eCtGjwZzYp+yQD6NNZVedqv5pky/qV/uZVpYzLWVj8bYiKGbCNYujRxCKbUUnzsY2fYH0Cu0ke796XoAAAAAElFTkSuQmCC'}], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.22_Bild_rechts_Hoehe_Steckdosen_Liste', {'name':'22_Bild_rechts_Hoehe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'8' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.23_Bild_rechts_Breite_Steckdosen_Liste', {'name':'23_Bild_rechts_Breite_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'8' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.24_Bild_rechts_Abstand_links_Steckdosen_Liste', {'name':'24_Bild_rechts_Abstand_links_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.25_Bild_rechts_Abstand_oben_Steckdosen_Liste', {'name':'25_Bild_rechts_Abstand_oben_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.26_Bild_rechts_Abstand_unten_Steckdosen_Liste', {'name':'26_Bild_rechts_Abstand_unten_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.27_Bild_rechts_Abstand_rechts_Steckdosen_Liste', {'name':'27_Bild_rechts_Abstand_rechts_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'0' }],   
                                   //Abstand Kopf zur Tabelle
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.28_Abstand_Tabelle_zum_Kopf_Steckdosen_Liste', {'name':'28_Abstand_Tabelle_zum_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'4' }],   
                                   //Rahmen Tabelle
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.29_Rahmenbreite_Tabelle_innen_Steckdosen_Liste', {'name':'29_Rahmenbreite_Tabelle_innen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'1' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.30_Rahmenfarbe_Tabelle_innen_Steckdosen_Liste', {'name':'30_Rahmenfarbe_Tabelle_innen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],           
                                   //Schrift in der Tabelle aktive Geräte
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.31_Tabelle_Schriftart_Steckdosen_Liste', {'name':'31_Tabelle_Schriftart_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'apple' }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.32_Tabelle_Schriftfarbe_aktives_Geraet_Steckdosen_Liste', {'name':'32_Tabelle_Schriftfarbe_aktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'red' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.33_Tabelle_Schriftgroesse_aktives_Geraet_Steckdosen_Liste', {'name':'33_Tabelle_Schriftgroesse_aktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'3.5' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.34_Tabelle_Schriftfarbe_aktives_Geraet_Status_Steckdosen_Liste', {'name':'34_Tabelle_Schriftfarbe_aktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'red' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.35_Tabelle_Schriftgroesse_aktives_Geraet_Status_Steckdosen_Liste', {'name':'35_Tabelle_Schriftgroesse_aktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'3.5' }],        
                                   //Schrift in der Tabelle inaktive Geräte
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.36_Tabelle_Schriftfarbe_inaktives_Geraet_Steckdosen_Liste', {'name':'36_Tabelle_Schriftfarbe_inaktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.37_Tabelle_Schriftgroesse_inaktives_Geraet_Steckdosen_Liste', {'name':'37_Tabelle_Schriftgroesse_inaktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'3.5' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.38_Tabelle_Schriftfarbe_inaktives_Geraet_Status_Steckdosen_Liste', {'name':'38_Tabelle_Schriftfarbe_inaktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'black' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.39_Tabelle_Schriftgroesse_inaktives_Geraet_Status_Steckdosen_Liste', {'name':'39_Tabelle_Schriftgroesse_inaktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':false, 'role':'text', 'def':'3.5' }],        
                                   //Schriftgroesse Status Geräte Ueberschrift
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.40_Ueberschrift_Schriftgroesse_aktive_Geraete', {'name':'40_Ueberschrift_Schriftgroesse_aktive_Geraete', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'3' }],        
                                   //Groesse Schaltfeld    
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.41_Schaltfeld_Groesse_Steckdosen_Liste', {'name':'41_Schaltfeld_Groesse_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':'4' }],        
                                   //////////////////////////////////////////////////
                                   // HTML Daten eigene Einstellungen beschreibbar // 
                                   //////////////////////////////////////////////////
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.01_Hintergrundfarbe_Steckdosen_Liste', {'name':'01_Hintergrundfarbe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],      
                                   //Rahmen Kopf
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.02_Rahmenbreite_Kopf_Steckdosen_Liste', {'name':'02_Rahmenbreite_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.03_Rahmenstyle_Kopf_Steckdosen_Liste', {'name':'03_Rahmenstyle_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.04_Rahmenfarbe_Kopf_Steckdosen_Liste', {'name':'04_Rahmenfarbe_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   //Rahmen Überschrift
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.05_Rahmenbreite_Ueberschrift_Steckdosen_Liste', {'name':'05_Rahmenbreite_Ueberschrift_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.06_Rahmenstyle_Ueberschrift_Steckdosen_Liste', {'name':'06_Rahmenstyle_Ueberschrift_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.07_Rahmenfarbe_Ueberschrift_Steckdosen_Liste', {'name':'07_Rahmenfarbe_Ueberschrift_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   //Rahmen Tabelle aussen
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.08_Rahmenbreite_Tabelle_aussen_Steckdosen_Liste', {'name':'08_Rahmenbreite_Tabelle_aussen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.09_Rahmenstyle_Tabelle_aussen_Steckdosen_Liste', {'name':'09_Rahmenstyle_Tabelle_aussen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.10_Rahmenfarbe_Tabelle_aussen_Steckdosen_Liste', {'name':'10_Rahmenfarbe_Tabelle_aussen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   //Ueberschrift
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.11_Ueberschrift_Schriftgroesse_Steckdosen_Liste', {'name':'11_Ueberschrift_Schriftgroesse_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.12_Ueberschrift_Farbe_Steckdosen_Liste', {'name':'12_Ueberschrift_Farbe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],       
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.13_Ueberschrift_Schriftart_Steckdosen_Liste', {'name':'13_Ueberschrift_Schriftart_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],           
                                   //Bild links
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.14_Bild_links_Steckdosen_Liste', {'name':'14_Bild_links_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.15_Bild_links_Hoehe_Steckdosen_Liste', {'name':'15_Bild_links_Hoehe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.16_Bild_links_Breite_Steckdosen_Liste', {'name':'16_Bild_links_Breite_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.17_Bild_links_Abstand_links_Steckdosen_Liste', {'name':'17_Bild_links_Abstand_links_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.18_Bild_links_Abstand_oben_Steckdosen_Liste', {'name':'18_Bild_links_Abstand_oben_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.19_Bild_links_Abstand_unten_Steckdosen_Liste', {'name':'19_Bild_links_Abstand_unten_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.20_Bild_links_Abstand_rechts_Steckdosen_Liste', {'name':'20_Bild_links_Abstand_rechts_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   //Bild rechts
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.21_Bild_rechts_Steckdosen_Liste', {'name':'21_Bild_rechts_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }], 
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.22_Bild_rechts_Hoehe_Steckdosen_Liste', {'name':'22_Bild_rechts_Hoehe_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.23_Bild_rechts_Breite_Steckdosen_Liste', {'name':'23_Bild_rechts_Breite_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.24_Bild_rechts_Abstand_links_Steckdosen_Liste', {'name':'24_Bild_rechts_Abstand_links_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.25_Bild_rechts_Abstand_oben_Steckdosen_Liste', {'name':'25_Bild_rechts_Abstand_oben_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.26_Bild_rechts_Abstand_unten_Steckdosen_Liste', {'name':'26_Bild_rechts_Abstand_unten_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.27_Bild_rechts_Abstand_rechts_Steckdosen_Liste', {'name':'27_Bild_rechts_Abstand_rechts_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   //Abstand Kopf zur Tabelle
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.28_Abstand_Tabelle_zum_Kopf_Steckdosen_Liste', {'name':'28_Abstand_Tabelle_zum_Kopf_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   //Rahmen Tabelle
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.29_Rahmenbreite_Tabelle_innen_Steckdosen_Liste', {'name':'29_Rahmenbreite_Tabelle_innen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.30_Rahmenfarbe_Tabelle_innen_Steckdosen_Liste', {'name':'30_Rahmenfarbe_Tabelle_innen_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],           
                                   //Schrift in der Tabelle aktive Gerätte
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.31_Tabelle_Schriftart_Steckdosen_Liste', {'name':'31_Tabelle_Schriftart_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.32_Tabelle_Schriftfarbe_aktives_Geraet_Steckdosen_Liste', {'name':'32_Tabelle_Schriftfarbe_aktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.33_Tabelle_Schriftgroesse_aktives_Geraet_Steckdosen_Liste', {'name':'33_Tabelle_Schriftgroesse_aktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.34_Tabelle_Schriftfarbe_aktives_Geraet_Status_Steckdosen_Liste', {'name':'34_Tabelle_Schriftfarbe_aktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.35_Tabelle_Schriftgroesse_aktives_Geraet_Status_Steckdosen_Liste', {'name':'35_Tabelle_Schriftgroesse_aktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],        
                                   //Schrift in der Tabelle inaktive Gerätte
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.36_Tabelle_Schriftfarbe_inaktives_Geraet_Steckdosen_Liste', {'name':'36_Tabelle_Schriftfarbe_inaktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.37_Tabelle_Schriftgroesse_inaktives_Geraet_Steckdosen_Liste', {'name':'37_Tabelle_Schriftgroesse_inaktives_Geraet_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.38_Tabelle_Schriftfarbe_inaktives_Geraet_Status_Steckdosen_Liste', {'name':'38_Tabelle_Schriftfarbe_inaktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],   
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.39_Tabelle_Schriftgroesse_inaktives_Geraet_Status_Steckdosen_Liste', {'name':'39_Tabelle_Schriftgroesse_inaktives_Geraet_Status_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],        
                                   //Schriftgroesse Status Geräte Ueberschrift
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.40_Ueberschrift_Schriftgroesse_aktive_Geraete', {'name':'40_Ueberschrift_Schriftgroesse_aktive_Geraete', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],        
                                   //Groesse Schaltfeld    
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.02_HTML_Eigene_Einstellungen.41_Schaltfeld_Groesse_Steckdosen_Liste', {'name':'41_Schaltfeld_Groesse_Steckdosen_Liste', 'type':'string', 'read':true, 'write':true, 'role':'text', 'def':' ' }],            
                                ];
                                await createUserStates(anlegen_in, statesToCreate)};
                                
                                //Telegram Steckdosen  Nachrichtenversand anlegen mit SmartNamen
                                if (Steckdosen_verwenden == true && Telegram_verwenden == true && Alexa_Ansage_verwenden == true){
                                let statesToCreate = [
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.05_Telegram.Telegram_Steckdosen_'+[etage]+'_Versand_an_aus', {'name':'Telegram_Steckdosen_'+[etage]+'_Versand_an_aus', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.05_Telegram.Telegram_Steckdosenstatus_'+[etage]+'_senden', {'name':'Telegram_Steckdosenstatus_'+[etage]+'_senden', 'type':'boolean', 'read':false, 'write':true, 'role':'button', 'def':true, "smartName": {"de": 'Telegram Steckdosenstatus '+[etage]+' senden',"smartType": "SWITCH"} }],   
                                ];
                                await createUserStates(anlegen_in, statesToCreate)};
                                
                                //Telegram Steckdosen  Nachrichtenversand anlegen ohne SmartNamen
                                if (Steckdosen_verwenden == true && Telegram_verwenden == true && Alexa_Ansage_verwenden == false){
                                let statesToCreate = [
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.05_Telegram.Telegram_Steckdosen_'+[etage]+'_Versand_an_aus', {'name':'Telegram_Steckdosen_'+[etage]+'_Versand_an_aus', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.05_Telegram.Telegram_Steckdosenstatus_'+[etage]+'_senden', {'name':'Telegram_Steckdosenstatus_'+[etage]+'_senden', 'type':'boolean', 'read':false, 'write':true, 'role':'button', 'def':true, "smartName": false }],   
                                ];
                                await createUserStates(anlegen_in, statesToCreate)};
                                
                                //E-Mail Steckdosen Nachrichtenversand anlegen mit SmartNamen
                                if (Steckdosen_verwenden == true && Email_verwenden == true && Alexa_Ansage_verwenden == true){
                                let statesToCreate = [
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.06_E-Mail.EMAIL_Steckdosen_'+[etage]+'_Versand_an_aus', {'name':'EMAIL_Steckdosen_'+[etage]+'_Versand_an_aus', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.06_E-Mail.EMAIL_Steckdosenstatus_'+[etage]+'_senden', {'name':'EMAIL_Steckdosenstatus_'+[etage]+'_senden', 'type':'boolean', 'read':false, 'write':true, 'role':'button', 'def':true, "smartName": {"de": 'EMAIL Steckdosenstatus '+[etage]+' senden',"smartType": "SWITCH"} }],   
                                ];
                                await createUserStates(anlegen_in, statesToCreate)};
                                
                                //E-Mail Steckdosen Nachrichtenversand anlegen mit SmartNamen
                                if (Steckdosen_verwenden == true && Email_verwenden == true && Alexa_Ansage_verwenden == false){
                                let statesToCreate = [
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.06_E-Mail.EMAIL_Steckdosen_'+[etage]+'_Versand_an_aus', {'name':'EMAIL_Steckdosen_'+[etage]+'_Versand_an_aus', 'type':'boolean', 'read':true, 'write':true, 'role':'switch', 'def':false }],
                                   ['Geraete_zaehlen.Steckdosen.'+[etage]+'.06_E-Mail.EMAIL_Steckdosenstatus_'+[etage]+'_senden', {'name':'EMAIL_Steckdosenstatus_'+[etage]+'_senden', 'type':'boolean', 'read':false, 'write':true, 'role':'button', 'def':true, "smartName": false }],   
                                ];
                                await createUserStates(anlegen_in, statesToCreate)};
                                
                                //#####################################################################################################################################################################################################################################################################################################################################################################################
                                
                                //Ab hier Datenpunkte löschen
                                //###############################################################################
                                
                                if (!Steckdosen_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen*');
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                if (!Steckdosen_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen*');
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                //###############################################################################
                                
                                if (!Alexa_Ansage_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen.*.04_Alexa.*');  
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                if (!Alexa_Ansage_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen.*.04_Alexa.*');  
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                //###############################################################################
                                
                                if (!Telegram_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen.*.05_Telegram.*'); 
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                if (!Telegram_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen.*.05_Telegram.*'); 
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                //###############################################################################
                                
                                if (!Email_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen.*.06_E-Mail.*'); 
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                if (!Email_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen.*.06_E-Mail.*'); 
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteState(id);
                                })};
                                
                                //###############################################################################
                                
                                //Funktion main mit Verzögerung aufrufen
                                //timeout = setTimeout(function () {
                                //  main();
                                //}, 5000);
                                main()
                                

                                Mein aktueller Versuch: (endet aber auch manchmal im Fehler, manchmal geht es aber auch x Mal ohne Fehler ? Wie müßte sowas "richtig" gemacht werden ? In dieser Testfunktion habe ich die Variablen, die sonst im Blockly sind, oben eingefügt. Die Datenpunkte sind nicht vollständig, sonder nur der Anfang. (der Aufruf von main() ist auch noch nicht drinn.
                                Über Hilfe würde ich mich freuen.

                                var Steckdosen_verwenden,Alexa_Ansage_verwenden,Telegram_verwenden,Email_verwenden,anlegen_in,etage;
                                anlegen_in = 'javascript.0'
                                etage = 'Haus'
                                Steckdosen_verwenden = true;
                                Alexa_Ansage_verwenden = true;
                                Telegram_verwenden = false;
                                Email_verwenden = false;
                                
                                
                                mainAsync();
                                async function mainAsync() {
                                
                                if(Steckdosen_verwenden){ 
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.01_Steckdosen_Anzahl_gesamt', {name:'01_Steckdosen_Anzahl_gesamt', type:'number', read:true, write:false, role:'value', unit:'Steckdosen', def:0 });
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.02_Steckdosen_Anzahl_eingeschaltet', {name:'02_Steckdosen_Anzahl_eingeschaltet',type:'number', read:true, write:false, role:'value',unit:'Steckdosen', def:0});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.03_Steckdosen_Anzahl_ausgeschaltet', {name:'03_Steckdosen_Anzahl_ausgeschaltet',type:'number', read:true, write:false, role:'value',unit:'Steckdosen', def:0});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.04_eingeschaltete_Steckdosen_Liste', {name:'04_eingeschaltete_Steckdosen_Liste',type:'string', read:true, write:false, role:'text', def:'noch leer'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.05_gesamte_Steckdosen_Liste', {name:'05_gesamte_Steckdosen_Liste',type:'string', read:true, write:false, role:'text', def:'noch leer'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.06_html_Steckdosen_Liste', {name:'06_html_Steckdosen_Liste',type:'string', read:true, write:false, role:'html', def:'noch leer'}); 
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.07_Steckdosen_Liste_mit_Emojis', {name:'07_Steckdosen_Liste_mit_Emojis',type:'string', read:true, write:false, role:'text', def:'noch leer'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.08_Steckdosen_Emoji_eingeschaltet', {name:'08_Steckdosen_Emoji_eingeschaltet',type:'mixed', read:true, write:true, role:'mixed'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.09_Steckdosen_Emoji_ausgeschaltet', {name:'09_Steckdosen_Emoji_ausgeschaltet',type:'mixed', read:true, write:true, role:'mixed'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.01_Anzeigen_und_Listen.10_html_nur_eingeschaltete_Steckdosen_Liste', {name:'10_html_nur_eingeschaltete_Steckdosen_Liste',type:'string', read:true, write:false, role:'html', def:'noch leer'});
                                
                                // iQontrol Trigger und Schalter
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.01_Thema_hell_Steckdosen_Liste', {name:'01_Thema_hell_Steckdosen_Liste',type:'boolean', read:true, write:true, role:'switch', def:true});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.02_Thema_dunkel_Steckdosen_Liste', {name:'02_Thema_dunkel_Steckdosen_Liste',type: 'boolean', read:true, write:true, role:'switch', def:false});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.03_Thema_eigenes_Steckdosen_Liste', {name:'03_Thema_eigenes_Steckdosen_Liste',type:'boolean', read:true, write:true, role:'switch', def:false});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.04_Trigger_Tabelle_iQontrol_Steckdosen_Liste', {name:'04_Trigger_Tabelle_iQontrol_Steckdosen_Liste',type:'boolean', read:false, write:true, role:'button', def:true});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.05_Schalter_fuer_Button_Tabelle_Steckdosen_Liste', {name:'05_Schalter_fuer_Button_Tabelle_Steckdosen_Liste',type:'boolean', read:true, write:true, role:'switch', def:false});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.06_Trigger_Farbe_iQontrol_Steckdosen_Liste', {name:'06_Trigger_Farbe_iQontrol_Steckdosen_Liste',type:'boolean', read:false, write:true, role:'button', def:true});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.07_Umschalter_Farbe_Steckdosen_Liste', {name:'07_Umschalter_Farbe_Steckdosen_Liste',type:'number', read:true, write:false, role:'value', def:0});
                                await  createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.08_Geraetestatus_in_Ueberschrift_an_aus', {name:'08_Geraetestatus_in_Ueberschrift_an_aus',type:'boolean', read:true, write:true, role:'switch', def:true});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.02_Trigger_und_Schalter.09_Geraete_in_HTML_Liste_schaltbar', {name:'09_Geraete_in_HTML_Liste_schaltbar',type:'boolean', read:true, write:true, role:'switch', def:true});
                                
                                // HTML Daten Hell-Dunkel nicht beschreibbar
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.01_Hintergrundfarbe_Steckdosen_Liste', {name:'01_Hintergrundfarbe_Steckdosen_Liste',type:'string', read:true, write:false, role:'text', def:'white'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.02_Rahmenbreite_Kopf_Steckdosen_Liste', {name:'02_Rahmenbreite_Kopf_Steckdosen_Liste',type:'string', read:true, write:false, role:'text', def:'0'});
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.03_HTML_Daten.01_HTML_Hell_Dunkel_Festeinstellung.03_Rahmenstyle_Kopf_Steckdosen_Liste', {name:'03_Rahmenstyle_Kopf_Steckdosen_Liste',type:'string', read:true, write:false, role:'text', def:'solid'})
                                
                                
                                
                                       // States erstellt   
                                       console.log('States 1 erfolgreich erstellt.');
                                   }} 
                                
                                
                                
                                alexa_dp_Async();
                                async function alexa_dp_Async() {
                                if(Alexa_Ansage_verwenden && Steckdosen_verwenden){ 
                                
                                await createStateAsync([anlegen_in]+'.Geraete_zaehlen.Steckdosen.'+[etage]+'.04_Alexa.01_Alexa_Routinebutton', {name:'01_Alexa_Routinebutton',type: 'boolean', read:false, write:true, role:'button',def:true, smartName: {'de': 'Steckdosenansage '+[etage],smartType:'SWITCH'}})
                                
                                       // States erstellt    
                                       console.log('States 2 erfolgreich erstellt.')
                                
                                   }} 
                                
                                
                                //Ab hier Datenpunkte löschen falls abgewählt
                                //###############################################################################
                                //alle DP löschen
                                if (!Steckdosen_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                      console.log('alle States vom Blockly Steckdosen zählen werden gelöscht')
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen*');
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                
                                if (!Steckdosen_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                       console.log('alle States vom Blockly Steckdosen zählen werden gelöscht')
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen*');
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                //###############################################################################
                                //Alexa DP löschen
                                if (!Alexa_Ansage_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                  console.log('Alexa State vom Blockly Steckdosen zählen wird gelöscht')
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen.*.04_Alexa.*');  
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                
                                if (!Alexa_Ansage_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                  console.log('Alexa State vom Blockly Steckdosen zählen wird gelöscht')
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen.*.04_Alexa.*');  
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                //###############################################################################
                                //Telegram DP löschen
                                if (!Telegram_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen.*.05_Telegram.*'); 
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                
                                if (!Telegram_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen.*.05_Telegram.*'); 
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                //###############################################################################
                                //E-Mail DP löschen
                                if (!Email_verwenden && anlegen_in.slice(0, 10) == 'javascript') {
                                const idsjs = $('javascript.*.Geraete_zaehlen.Steckdosen.*.06_E-Mail.*'); 
                                idsjs.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                
                                if (!Email_verwenden && anlegen_in.slice(0, 10) == '0_userdata') {
                                const idsud = $('0_userdata.0.Geraete_zaehlen.Steckdosen.*.06_E-Mail.*'); 
                                idsud.each(function(id, i) {
                                  if(existsState(id)) deleteStateAsync(id);
                                })};
                                //###############################################################################
                                
                                
                                
                                

                                EDIT: JS-Adapter 5.2.18 (aber auch latest probiert)

                                EDIT2: oder hat der Fehler damit zu tun ? https://github.com/ioBroker/ioBroker.javascript/issues/924

                                Acgua created this issue in ioBroker/ioBroker.javascript

                                closed createState()/createStateAsync() issue, if 2nd param = initial value, and 3rd param = common obj #924

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

                                  @dslraser sagte in async / await -> Muster Anleitung gesucht:

                                  State "javascript.0.Geraete_zaehlen.Steckdosen.Haus.01_Anzeigen_und_Listen.04_eingeschaltete_Steckdosen_Liste"

                                  was ist mit diesem DP wenn du nach der Fehlermeldung in den Objekten schaust? Evtl. nach Refresh oder testweise Adapter-Neustart. Wenn der State dann da ist würde ich auf das im issue genannte Timing Problem tippen. Allerdings wird dort der Fehler nur genannt wenn ein init Wert besteht, nicht wenn man diesen in common.def definiert. Das ist aber bei dir so. Das issue habe ich selbst auch nicht, evtl. weil ich etwas schnellere Hardware nutze

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

                                    @fastfoot
                                    der DP aus der Fehlermeldung ist immer da.

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

                                      @dslraser sagte in async / await -> Muster Anleitung gesucht:

                                      @fastfoot
                                      der DP aus der Fehlermeldung ist immer da.

                                      dann ist es wohl ein Timing problem. Das async/await ist schon ok und kann auch nicht 'verbessert' werden. Ich würde als Workaround ein await wait(1000) hinter den Aufruf von createStates() setzen. Eigentlich sollte aber genau das ja durch await vermieden werden. Im issue wurde es als enhancement markiert, in meinen Augen wäre das dann aber ein Bug. @apollon77 hast du dazu eine Antwort?

                                      dslraser apollon77 2 Replies Last reply Reply Quote 0
                                      • dslraser
                                        dslraser Forum Testing Most Active @fastfoot last edited by

                                        @fastfoot sagte in async / await -> Muster Anleitung gesucht:

                                        await wait(1000)

                                        damit lief es eben sauber durch. Mal sehen wie weit ich mit der Zeit runter gehen kann.

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

                                          @dslraser sagte in async / await -> Muster Anleitung gesucht:

                                          @fastfoot sagte in async / await -> Muster Anleitung gesucht:

                                          await wait(1000)

                                          damit lief es eben sauber durch. Mal sehen wie weit ich mit der Zeit runter gehen kann.

                                          das tat es ja vorher auch schon ohne das Warten 🙂 Ich würde es erst mal so lassen, da es nur ein Workaround sein kann bis der eigentliche Fehler gefunden und gefixt ist. Mir ist es noch nicht ganz klar weil ich von await erwartet hätte dass die Funktion dann auch wirklich fertig ist und nicht noch etwas im Hintergrund rumtrödelt. Aber mal sehen was apollon77 dazu sagt falls er die Zeit findet

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

                                            @fastfoot
                                            selbst mit await wait(100)lief es jetzt x Mal sauber und ohne Absturz durch, also wirklich irgendein Timing Problem.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            938
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            10
                                            35
                                            2046
                                            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