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

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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. async / await -> Muster Anleitung gesucht

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    524

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

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

async / await -> Muster Anleitung gesucht

Geplant Angeheftet Gesperrt Verschoben JavaScript
35 Beiträge 10 Kommentatoren 3.4k Aufrufe 13 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • H Hendrick

    @bahnuhr

    test();
    async function test() {
    
        try {
    
            await sleep(3*1000); // Erst mal 3 Sekunden warten
            await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});
            await sleep(1*1000); // Eine Sekunde warten
            await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});
    
        } catch (error) {
            return;
        }
    
    }
    
    

    Noch eine Error-Fehlerausgabe ins log erforderlich. Aber so wäre ein Grundkonstrukt.

    arteckA Offline
    arteckA Offline
    arteck
    Developer Most Active
    schrieb am zuletzt editiert von arteck
    #6

    @hendrick nicht ganz

    // funktion aufrufen
    await test();   //  warte bis die ganze funktion fertig ist
    
    
    
    
    
    async function test() {
        try {
            await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});   // warte bis setStateAsync meldet ist durch
            await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});    // warte bis setStateAsync meldet ist durch
            let res =  await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});    // warte bis setStateAsync meldet ist durch und gibt das ergebnis in die res variable
    
        } catch (error) {
            return;
        }
    }
    

    man kann es noch mehr aufbohren und einen return wert ausgeben... und und und

    zigbee hab ich, zwave auch, nuc's genauso und HA auch

    liv-in-skyL 1 Antwort Letzte Antwort
    1
    • liv-in-skyL liv-in-sky

      @bahnuhr vielleicht könntest du mal die einzelnen funktionen hier zeigen oder dein existierendes script posten. dann wäre es einfacher, ein muster zu erstellen. so könnte man dann jeden deiner punkte als funktion darstellen und das ganze schrittweise aufbauen - nicht jeder hat ein yamaha system und weiß, wie das zu steuern ist

      bahnuhrB Online
      bahnuhrB Online
      bahnuhr
      Forum Testing Most Active
      schrieb am zuletzt editiert von bahnuhr
      #7

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

      existierendes script posten

      Na klar kann ich dies machen; ist aber sehr komplex und auf mich abgestimmt.

      
      // Yamaha; Text ansagen auf Lautsprecher
      //
      // Folgender Ablauf:
      // - prüfen ob Gerät im Wlan ist (mittels ping) -> ping ist vorher einzurichten
      // - prüfen ob Gerät aus ist; wenn aus dann einschalten
      // - prüfen ob Input "Server"; wenn nein dann Umschalten auf Input "Server"
      // - Verzeichnis (wo der Lautsprecher die Dateien findet) einstellen
      // - Dateien abspielen
      //
      // Habe folgendes globales Script eingefügt:
      //    function Yamaha (IP, x, sound) {
      //       setState('javascript.0.Geräte.Yamaha.Lautsprecher_IP', IP);    // einstellen welcher Lautsprecher wiedergeben soll
      //       setState('sayit.2.tts.text', x);                               // mp3 wird erzeugt
      //       setState('javascript.0.Geräte.Yamaha.Ansage', true);           // abspielen der mp3 Datei auf dem Lautsprecher
      //       switch (sound) {
      //          case 1:     setState('javascript.0.Geräte.Yamaha.Sound', "intercom.mp3");           break;
      //          case 2:     setState('javascript.0.Geräte.Yamaha.Sound', "tos-computer-03.mp3");    break;
      //          case 3:     setState('javascript.0.Geräte.Yamaha.Sound', "tng_red_alert2.mp3");     break;
      //          default:    setState('javascript.0.Geräte.Yamaha.Sound', "intercom.mp3");           break;
      //        }
      //    }
      //
      // Aufruf erfolgt mit
      //  Yamaha ('192.168.243.201', 'Test Test', Sound-Nr.);   
      //
      //  01.2019 bahnuhr
      //
      
      
      // Variablen definieren
         var logging = true,    yamaha_IP = "",     yamaha = "";
         var OrdnerVerz = "1_Sound";         // In diesem Ordner liegen die Dateien, Verzeichnis auf c:\iobroker ; dieses Verz. wird gestreamt mit wmp
         var Ansage_Lautstaerke = 40;        // Lautstärke für das Abspielen der Dateien
         var MC_ID = "",     stand_alt_Power = "",   stand_alt_Lautstaerke = 0,      stand_alt_Input = "";
         var request = require('request'),   fs = require('fs');
      
      
      // wenn ...Ansage auf true dann mp3 kopieren und Text ansagen
         on({id: "javascript.0.Geräte.Yamaha.Ansage", change: "any", val: true}, function() {  
             setStateDelayed('javascript.0.Geräte.Yamaha.Ansage', false, 10000);
             yamaha_IP = getState('javascript.0.Geräte.Yamaha.Lautsprecher_IP').val;
             yamaha = "http://" + yamaha_IP + "/YamahaExtendedControl/v1/";
             switch (yamaha_IP) {
                 case '192.168.243.200':     MC_ID = "RX-V685_0DA87303";     Ansage_Lautstaerke = 91;    if (logging) log('MC_ID und Lautstärke - Receiver');        break;      // Wohnzimmer
                 case '192.168.243.201':     MC_ID = "WX-021_0DA87510";      Ansage_Lautstaerke = 40;    if (logging) log('MC_ID und Lautstärke - Schlafzimmer');    break;      // Schlafzimmer
                 case '192.168.243.202':     MC_ID = "WX-010_04955483";      Ansage_Lautstaerke = 40;    if (logging) log('MC_ID und Lautstärke - Philipp');          break;     // Philipp
                 case '192.168.243.203':     MC_ID = "WX-010_03B558C3";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Büro');            break;      // Büro
                 case '192.168.243.204':     MC_ID = "WX-010_0DA87930";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Bad-EG');            break;    // Bad EG
                 case '192.168.243.205':     MC_ID = "WX-010_01234150";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Küche');            break;     // Küche
                 case '192.168.243.206':     MC_ID = "WX-010_0BA15680";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Fitnessraum');     break;      // Fitnessraum
                 case '192.168.243.207':     MC_ID = "WX-030_0ABC8899";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Hobbyraum');       break;      // Hobbyraum
                 case '192.168.243.208':     MC_ID = "WX-010_01A33445";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Gäste-WC');           break;      // Gäste-WC
                 case '192.168.243.209':     MC_ID = "WX-010_0CDAB879";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Sauna');           break;      // Sauna
                 case '192.168.243.210':     MC_ID = "WX-030_0ABX1237";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Test2');           break;      // Test2
             }
             Beginn();
         });
      
      
      // Beginn
         function Beginn() {
             // Ist der Lautsprecher im Netz erreichbar
                 x = yamaha_IP.replace('.', '_');    x = x.replace('.', '_');    x = x.replace('.', '_'); 
                 if (logging) log('Beginn: x = ' + x);
                 if (getState('ping.0.' + PC_Name() + '.' + x).val) {
                     // Ist power an ?
                         if (getState('musiccast.0.' + MC_ID + '.main.power').val == false) {
                             stand_alt_Power = "aus";
                             if (logging) log('Beginn: stand_alt_Power = ' + stand_alt_Power);
                             power();                        // Power einschalten
                         } else {
                             stand_alt_Power = "an";
                             if (logging) log('Beginn: stand_alt_Power = ' + stand_alt_Power);
                         }
                     // Dateien kopieren ; Input und Lautstärke setzen ; Verzeichnis einstellen
                         setTimeout(function() {     input_lautstaerke();    }, 2000);       // Input und Lautstärke setzen
                         setTimeout(function() {     Dateien();              }, 3000);       // Dateien kopieren
                         setTimeout(function() {     pruef_Verzeichnis(0);   }, 7000);       // Verzeichnis einstellen
                 }
         }
      
      // power on 
         function power() {
             request(yamaha + 'main/setPower?power=on', function (error, response, body) {
                 if (!error && response.statusCode == 200) { if (logging) log('power: ' + yamaha_IP + '; Power eingeschaltet');  } else {    log("power: Error: MusicCast = " + error);  }
             });
         }
      
      // Dateien kopieren
         function Dateien() {
             setTimeout(function() {
                 Datei_kopieren("/opt/iobroker/iobroker-data/files/vis.0/mp3/" + getState('javascript.0.Geräte.Yamaha.Sound').val,"/mnt/1_Sound.mp3");
             }, 1000);
             setTimeout(function(){ request('http://192.168.243.12:8082/state/sayit.2.tts.mp3', {encoding:'binary'}, function(error, response, body) {
                 fs.writeFile("/mnt/2_sayit.mp3", body, 'binary', function (err) { if(err) log('Fehler!'); }); });
             }, 2000);
             if (logging) log('Dateien kopiert.');
         }
      
      // Input_Lautstärke setzen
         function input_lautstaerke() {
             stand_alt_Input = getState('musiccast.0.' + MC_ID + '.main.input').val;
             if (logging) log('Input_Lautstärke setzen: stand_alt_Input = ' + stand_alt_Input);
             // prüfen input
                 if (stand_alt_Input != "server") setState('musiccast.0.' + MC_ID + '.main.input', 'server');
             // Lautstärke
                 stand_alt_Lautstaerke = getState('musiccast.0.' + MC_ID + '.main.volume').val;
                 if (logging) log('Input_Lautstärke setzen: stand_alt_Lautstaerke = ' + stand_alt_Lautstaerke);
                 setState('musiccast.0.' + MC_ID + '.main.volume', Ansage_Lautstaerke);
                 if (logging) log('Input_Lautstärke setzen: Lautstärke gesetzt auf = ' + Ansage_Lautstaerke);
         }
      
      // Verzeichnis prüfen
         function pruef_Verzeichnis(index) {
             request(yamaha + 'netusb/getListInfo?input=server&index=' + index + '"&size=8&lang=de', function (error, response, body) {
                 if (!error && response.statusCode == 200) {
                     if (logging) log('Verzeichnis prüfen: json = ' + body);
                     var obj = JSON.parse(body);
                     var Verz = JSON.parse(JSON.stringify(obj.list_info, ['text']));
                     if (logging) log('Verzeichnis prüfen: aktueller Ordner = ' + obj.menu_name);
                     if (obj.menu_name == "SERVER"|| obj.menu_name == "Universal Media Server" || obj.menu_name == OrdnerVerz ) {
                         if (obj.menu_name == "SERVER") { var Nr = -1;       // menu_name ist Server - wechseln zu "Universal Media Server
                             for(var i in Verz){ vtext = JSON.stringify(Verz[i]); vtext = vtext.replace('{"text":"', ''); vtext = vtext.replace('"}', ''); if (vtext == "Universal Media Server") Nr = i; log ("Nr.= " + i + ", " + vtext); }
                             if (Nr >= 0) { if (logging) log('Verzeichnis: "Universal Media Server" vorhanden, Nr. '+ Nr + ' wird gesetzt !'); setzen_Verzeichnis(Nr); } else { if (logging) log('Verzeichnis: "Universal Media Server" ist nicht vorhanden !'); }
                         }
                         if (obj.menu_name == "Universal Media Server") { var Nr = -1;       // menu_name ist Universal Media Server - wechseln zu "1_Sound
                             for(var i in Verz){ vtext = JSON.stringify(Verz[i]); vtext = vtext.replace('{"text":"', ''); vtext = vtext.replace('"}', ''); if (vtext == OrdnerVerz) Nr = i; log ("Nr.= " + i + ", " + vtext); }
                             if (Nr >= 0) { if (logging) log('Verzeichnis: "' + OrdnerVerz + '" vorhanden, Nr. '+ Nr + ' wird gesetzt !'); setzen_Verzeichnis(Nr); } else { if (logging) log('Verzeichnis: "' + OrdnerVerz + '" ist nicht vorhanden !'); }
                         }
                         if (obj.menu_name == OrdnerVerz) play_Datei(); 
                     } else {
                         if (logging) log('-Abbruch- Verzeichnis "Server, UMS oder ' + OrdnerVerz + '" ist nicht vorhanden !');
                     }
                 } else {
                     log("Error: MusicCast - Prüf Verzeichnis = " + error);
                 }
             });
         }
      
      // Verzeichnis setzen
         function setzen_Verzeichnis(index) {
             request(yamaha + 'netusb/setListControl?list_id=main&type=select&index=' + index, function (error, response, body) {
                 if (!error && response.statusCode == 200) {
                     if (logging) log('Verzeichnis setzen: erfolgreich gesetzt !');
                     if (logging) log('Verzeichnis setzen: json = ' + body);
                     obj = JSON.parse(body);
                     if (obj.response_code == "0") {
                         if (logging) log('Verzeichnis setzen: erfolgreich gesetzt !');
                         pruef_Verzeichnis(0);
                     } else {
                         log("Error: Verzeichnis konnte nicht gesetzt werden !");
                     }
                 } else {
                     log("Error: MusicCast - setzen Verzeichnis = " + error);
                 }
                 });
         }
      
      // Datei abspielen
         function play_Datei() {
             request(yamaha + 'netusb/setListControl?list_id=main&type=play&index=0', function (error, response, body) {
                 if (!error && response.statusCode == 200) {
                     log ("MusicCast - Datei wird abgespielt !");
                     Stand_alt_herstellen();
                     setTimeout(function() { Dateien_loeschen(); },15000);
                 } else {
                     log("Error: MusicCast - play Datei = " + error);
                 }
                 });
         }
      
      // Dateien wieder löschen
         function Dateien_loeschen() {
             if (fs.existsSync('/mnt/1_sound.mp3')) {                                // Datei ist vorhanden
                 Datei_loeschen('/mnt/1_sound.mp3');
             } else {                                                                                                    // Datei ist nicht vorhanden
                 if (logging) log ("Datei: -mnt/1_sound.mp3- wurde nicht gelöscht");
             }    
             if (fs.existsSync('/mnt/2_sayit.mp3')) {                                // Datei ist vorhanden
                 Datei_loeschen('/mnt/2_sayit.mp3');
             } else {                                                                                                    // Datei ist nicht vorhanden
                 if (logging) log ("Datei: -mnt/2_sayit.mp3- wurde nicht gelöscht");
             } 
         }
         
      // alte Stände wieder herstellen
         function Stand_alt_herstellen() {
             // Input und Lautstärke
                 setTimeout(function() {
                     setState('musiccast.0.' + MC_ID + '.main.volume', stand_alt_Lautstaerke);
                     if (stand_alt_Input != "server") setState('musiccast.0.' + MC_ID + '.main.input', stand_alt_Input);
                     if (logging && stand_alt_Input != "server") log('alte Stände wieder herstellen: Input wieder auf = ' + stand_alt_Input);
                 },10000);
             // Power
                 setTimeout(function() {
                     if (stand_alt_Power == "aus") setState('musiccast.0.' + MC_ID + '.main.power', false);
                     if (logging && stand_alt_Power == "aus") log('alte Stände wieder herstellen: Power = ' + stand_alt_Power);
                 },12000);
         }
      
      

      Erklärung:
      In den Zeilen 77-79 werden per timeout die einzelnen Funktionen aufgerufen.
      90 ff.: Hier wird die Datei kopiert
      114 ff: Hier wird geprüft ob das richtige "Verzeichnis" auf dem yamaha Lautspreche per api eingestellt ist.
      141 ff: Unterprogramm um ein Verzeichnis zu setzen
      160 ff: Hier wird die erstellte mp3 dann abgespielt
      173 ff: Dateien werden wieder gelöscht

      mfg
      Dieter


      Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
      Danke.
      gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
      ScreenToGif :https://www.screentogif.com/downloads.html

      liv-in-skyL 1 Antwort Letzte Antwort
      0
      • AsgothianA Asgothian

        @bahnuhr

        Das Await wartet nicht bis etwas fertig ist, sondern bis eine Funktion vollständig durchgelaufen ist. Was du also brauchst sind Funktionen die erst zurück kommen bis die dazu gehörige Funktion erledigt ist. Dieses ist die Schlüsselaufgabe, die mit async/await erst einmal nichts zu tun hat. Insbesondere das mp3 erstellen und kopieren muss entsprechend abgedeckt sein.

        Diese solltest du als async definieren, dann kannst du diese mit await aufrufen.

        A.

        bahnuhrB Online
        bahnuhrB Online
        bahnuhr
        Forum Testing Most Active
        schrieb am zuletzt editiert von
        #8

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

        Diese solltest du als async definieren, dann kannst du diese mit await aufrufen.

        Danke für die Info. Aber so richtig verstanden habe ich dies nicht.

        Nach meinem Verständnis muss das System doch zurück geben: Dateien sind kopiert oder mp3 ist erstellt.
        Also so ein return "erledigt".

        Nur wie ?


        Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
        Danke.
        gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
        ScreenToGif :https://www.screentogif.com/downloads.html

        AlCalzoneA 1 Antwort Letzte Antwort
        0
        • bahnuhrB bahnuhr

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

          existierendes script posten

          Na klar kann ich dies machen; ist aber sehr komplex und auf mich abgestimmt.

          
          // Yamaha; Text ansagen auf Lautsprecher
          //
          // Folgender Ablauf:
          // - prüfen ob Gerät im Wlan ist (mittels ping) -> ping ist vorher einzurichten
          // - prüfen ob Gerät aus ist; wenn aus dann einschalten
          // - prüfen ob Input "Server"; wenn nein dann Umschalten auf Input "Server"
          // - Verzeichnis (wo der Lautsprecher die Dateien findet) einstellen
          // - Dateien abspielen
          //
          // Habe folgendes globales Script eingefügt:
          //    function Yamaha (IP, x, sound) {
          //       setState('javascript.0.Geräte.Yamaha.Lautsprecher_IP', IP);    // einstellen welcher Lautsprecher wiedergeben soll
          //       setState('sayit.2.tts.text', x);                               // mp3 wird erzeugt
          //       setState('javascript.0.Geräte.Yamaha.Ansage', true);           // abspielen der mp3 Datei auf dem Lautsprecher
          //       switch (sound) {
          //          case 1:     setState('javascript.0.Geräte.Yamaha.Sound', "intercom.mp3");           break;
          //          case 2:     setState('javascript.0.Geräte.Yamaha.Sound', "tos-computer-03.mp3");    break;
          //          case 3:     setState('javascript.0.Geräte.Yamaha.Sound', "tng_red_alert2.mp3");     break;
          //          default:    setState('javascript.0.Geräte.Yamaha.Sound', "intercom.mp3");           break;
          //        }
          //    }
          //
          // Aufruf erfolgt mit
          //  Yamaha ('192.168.243.201', 'Test Test', Sound-Nr.);   
          //
          //  01.2019 bahnuhr
          //
          
          
          // Variablen definieren
             var logging = true,    yamaha_IP = "",     yamaha = "";
             var OrdnerVerz = "1_Sound";         // In diesem Ordner liegen die Dateien, Verzeichnis auf c:\iobroker ; dieses Verz. wird gestreamt mit wmp
             var Ansage_Lautstaerke = 40;        // Lautstärke für das Abspielen der Dateien
             var MC_ID = "",     stand_alt_Power = "",   stand_alt_Lautstaerke = 0,      stand_alt_Input = "";
             var request = require('request'),   fs = require('fs');
          
          
          // wenn ...Ansage auf true dann mp3 kopieren und Text ansagen
             on({id: "javascript.0.Geräte.Yamaha.Ansage", change: "any", val: true}, function() {  
                 setStateDelayed('javascript.0.Geräte.Yamaha.Ansage', false, 10000);
                 yamaha_IP = getState('javascript.0.Geräte.Yamaha.Lautsprecher_IP').val;
                 yamaha = "http://" + yamaha_IP + "/YamahaExtendedControl/v1/";
                 switch (yamaha_IP) {
                     case '192.168.243.200':     MC_ID = "RX-V685_0DA87303";     Ansage_Lautstaerke = 91;    if (logging) log('MC_ID und Lautstärke - Receiver');        break;      // Wohnzimmer
                     case '192.168.243.201':     MC_ID = "WX-021_0DA87510";      Ansage_Lautstaerke = 40;    if (logging) log('MC_ID und Lautstärke - Schlafzimmer');    break;      // Schlafzimmer
                     case '192.168.243.202':     MC_ID = "WX-010_04955483";      Ansage_Lautstaerke = 40;    if (logging) log('MC_ID und Lautstärke - Philipp');          break;     // Philipp
                     case '192.168.243.203':     MC_ID = "WX-010_03B558C3";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Büro');            break;      // Büro
                     case '192.168.243.204':     MC_ID = "WX-010_0DA87930";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Bad-EG');            break;    // Bad EG
                     case '192.168.243.205':     MC_ID = "WX-010_01234150";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Küche');            break;     // Küche
                     case '192.168.243.206':     MC_ID = "WX-010_0BA15680";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Fitnessraum');     break;      // Fitnessraum
                     case '192.168.243.207':     MC_ID = "WX-030_0ABC8899";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Hobbyraum');       break;      // Hobbyraum
                     case '192.168.243.208':     MC_ID = "WX-010_01A33445";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Gäste-WC');           break;      // Gäste-WC
                     case '192.168.243.209':     MC_ID = "WX-010_0CDAB879";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Sauna');           break;      // Sauna
                     case '192.168.243.210':     MC_ID = "WX-030_0ABX1237";      Ansage_Lautstaerke = 30;    if (logging) log('MC_ID und Lautstärke - Test2');           break;      // Test2
                 }
                 Beginn();
             });
          
          
          // Beginn
             function Beginn() {
                 // Ist der Lautsprecher im Netz erreichbar
                     x = yamaha_IP.replace('.', '_');    x = x.replace('.', '_');    x = x.replace('.', '_'); 
                     if (logging) log('Beginn: x = ' + x);
                     if (getState('ping.0.' + PC_Name() + '.' + x).val) {
                         // Ist power an ?
                             if (getState('musiccast.0.' + MC_ID + '.main.power').val == false) {
                                 stand_alt_Power = "aus";
                                 if (logging) log('Beginn: stand_alt_Power = ' + stand_alt_Power);
                                 power();                        // Power einschalten
                             } else {
                                 stand_alt_Power = "an";
                                 if (logging) log('Beginn: stand_alt_Power = ' + stand_alt_Power);
                             }
                         // Dateien kopieren ; Input und Lautstärke setzen ; Verzeichnis einstellen
                             setTimeout(function() {     input_lautstaerke();    }, 2000);       // Input und Lautstärke setzen
                             setTimeout(function() {     Dateien();              }, 3000);       // Dateien kopieren
                             setTimeout(function() {     pruef_Verzeichnis(0);   }, 7000);       // Verzeichnis einstellen
                     }
             }
          
          // power on 
             function power() {
                 request(yamaha + 'main/setPower?power=on', function (error, response, body) {
                     if (!error && response.statusCode == 200) { if (logging) log('power: ' + yamaha_IP + '; Power eingeschaltet');  } else {    log("power: Error: MusicCast = " + error);  }
                 });
             }
          
          // Dateien kopieren
             function Dateien() {
                 setTimeout(function() {
                     Datei_kopieren("/opt/iobroker/iobroker-data/files/vis.0/mp3/" + getState('javascript.0.Geräte.Yamaha.Sound').val,"/mnt/1_Sound.mp3");
                 }, 1000);
                 setTimeout(function(){ request('http://192.168.243.12:8082/state/sayit.2.tts.mp3', {encoding:'binary'}, function(error, response, body) {
                     fs.writeFile("/mnt/2_sayit.mp3", body, 'binary', function (err) { if(err) log('Fehler!'); }); });
                 }, 2000);
                 if (logging) log('Dateien kopiert.');
             }
          
          // Input_Lautstärke setzen
             function input_lautstaerke() {
                 stand_alt_Input = getState('musiccast.0.' + MC_ID + '.main.input').val;
                 if (logging) log('Input_Lautstärke setzen: stand_alt_Input = ' + stand_alt_Input);
                 // prüfen input
                     if (stand_alt_Input != "server") setState('musiccast.0.' + MC_ID + '.main.input', 'server');
                 // Lautstärke
                     stand_alt_Lautstaerke = getState('musiccast.0.' + MC_ID + '.main.volume').val;
                     if (logging) log('Input_Lautstärke setzen: stand_alt_Lautstaerke = ' + stand_alt_Lautstaerke);
                     setState('musiccast.0.' + MC_ID + '.main.volume', Ansage_Lautstaerke);
                     if (logging) log('Input_Lautstärke setzen: Lautstärke gesetzt auf = ' + Ansage_Lautstaerke);
             }
          
          // Verzeichnis prüfen
             function pruef_Verzeichnis(index) {
                 request(yamaha + 'netusb/getListInfo?input=server&index=' + index + '"&size=8&lang=de', function (error, response, body) {
                     if (!error && response.statusCode == 200) {
                         if (logging) log('Verzeichnis prüfen: json = ' + body);
                         var obj = JSON.parse(body);
                         var Verz = JSON.parse(JSON.stringify(obj.list_info, ['text']));
                         if (logging) log('Verzeichnis prüfen: aktueller Ordner = ' + obj.menu_name);
                         if (obj.menu_name == "SERVER"|| obj.menu_name == "Universal Media Server" || obj.menu_name == OrdnerVerz ) {
                             if (obj.menu_name == "SERVER") { var Nr = -1;       // menu_name ist Server - wechseln zu "Universal Media Server
                                 for(var i in Verz){ vtext = JSON.stringify(Verz[i]); vtext = vtext.replace('{"text":"', ''); vtext = vtext.replace('"}', ''); if (vtext == "Universal Media Server") Nr = i; log ("Nr.= " + i + ", " + vtext); }
                                 if (Nr >= 0) { if (logging) log('Verzeichnis: "Universal Media Server" vorhanden, Nr. '+ Nr + ' wird gesetzt !'); setzen_Verzeichnis(Nr); } else { if (logging) log('Verzeichnis: "Universal Media Server" ist nicht vorhanden !'); }
                             }
                             if (obj.menu_name == "Universal Media Server") { var Nr = -1;       // menu_name ist Universal Media Server - wechseln zu "1_Sound
                                 for(var i in Verz){ vtext = JSON.stringify(Verz[i]); vtext = vtext.replace('{"text":"', ''); vtext = vtext.replace('"}', ''); if (vtext == OrdnerVerz) Nr = i; log ("Nr.= " + i + ", " + vtext); }
                                 if (Nr >= 0) { if (logging) log('Verzeichnis: "' + OrdnerVerz + '" vorhanden, Nr. '+ Nr + ' wird gesetzt !'); setzen_Verzeichnis(Nr); } else { if (logging) log('Verzeichnis: "' + OrdnerVerz + '" ist nicht vorhanden !'); }
                             }
                             if (obj.menu_name == OrdnerVerz) play_Datei(); 
                         } else {
                             if (logging) log('-Abbruch- Verzeichnis "Server, UMS oder ' + OrdnerVerz + '" ist nicht vorhanden !');
                         }
                     } else {
                         log("Error: MusicCast - Prüf Verzeichnis = " + error);
                     }
                 });
             }
          
          // Verzeichnis setzen
             function setzen_Verzeichnis(index) {
                 request(yamaha + 'netusb/setListControl?list_id=main&type=select&index=' + index, function (error, response, body) {
                     if (!error && response.statusCode == 200) {
                         if (logging) log('Verzeichnis setzen: erfolgreich gesetzt !');
                         if (logging) log('Verzeichnis setzen: json = ' + body);
                         obj = JSON.parse(body);
                         if (obj.response_code == "0") {
                             if (logging) log('Verzeichnis setzen: erfolgreich gesetzt !');
                             pruef_Verzeichnis(0);
                         } else {
                             log("Error: Verzeichnis konnte nicht gesetzt werden !");
                         }
                     } else {
                         log("Error: MusicCast - setzen Verzeichnis = " + error);
                     }
                     });
             }
          
          // Datei abspielen
             function play_Datei() {
                 request(yamaha + 'netusb/setListControl?list_id=main&type=play&index=0', function (error, response, body) {
                     if (!error && response.statusCode == 200) {
                         log ("MusicCast - Datei wird abgespielt !");
                         Stand_alt_herstellen();
                         setTimeout(function() { Dateien_loeschen(); },15000);
                     } else {
                         log("Error: MusicCast - play Datei = " + error);
                     }
                     });
             }
          
          // Dateien wieder löschen
             function Dateien_loeschen() {
                 if (fs.existsSync('/mnt/1_sound.mp3')) {                                // Datei ist vorhanden
                     Datei_loeschen('/mnt/1_sound.mp3');
                 } else {                                                                                                    // Datei ist nicht vorhanden
                     if (logging) log ("Datei: -mnt/1_sound.mp3- wurde nicht gelöscht");
                 }    
                 if (fs.existsSync('/mnt/2_sayit.mp3')) {                                // Datei ist vorhanden
                     Datei_loeschen('/mnt/2_sayit.mp3');
                 } else {                                                                                                    // Datei ist nicht vorhanden
                     if (logging) log ("Datei: -mnt/2_sayit.mp3- wurde nicht gelöscht");
                 } 
             }
             
          // alte Stände wieder herstellen
             function Stand_alt_herstellen() {
                 // Input und Lautstärke
                     setTimeout(function() {
                         setState('musiccast.0.' + MC_ID + '.main.volume', stand_alt_Lautstaerke);
                         if (stand_alt_Input != "server") setState('musiccast.0.' + MC_ID + '.main.input', stand_alt_Input);
                         if (logging && stand_alt_Input != "server") log('alte Stände wieder herstellen: Input wieder auf = ' + stand_alt_Input);
                     },10000);
                 // Power
                     setTimeout(function() {
                         if (stand_alt_Power == "aus") setState('musiccast.0.' + MC_ID + '.main.power', false);
                         if (logging && stand_alt_Power == "aus") log('alte Stände wieder herstellen: Power = ' + stand_alt_Power);
                     },12000);
             }
          
          

          Erklärung:
          In den Zeilen 77-79 werden per timeout die einzelnen Funktionen aufgerufen.
          90 ff.: Hier wird die Datei kopiert
          114 ff: Hier wird geprüft ob das richtige "Verzeichnis" auf dem yamaha Lautspreche per api eingestellt ist.
          141 ff: Unterprogramm um ein Verzeichnis zu setzen
          160 ff: Hier wird die erstellte mp3 dann abgespielt
          173 ff: Dateien werden wieder gelöscht

          mfg
          Dieter

          liv-in-skyL Offline
          liv-in-skyL Offline
          liv-in-sky
          schrieb am zuletzt editiert von
          #9

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

          ist aber sehr komplex und auf mich abgestimmt

          daher gibt es ja auch kein allgemeines muster - jedes script ist anders :-)

          nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

          1 Antwort Letzte Antwort
          0
          • arteckA arteck

            @hendrick nicht ganz

            // funktion aufrufen
            await test();   //  warte bis die ganze funktion fertig ist
            
            
            
            
            
            async function test() {
                try {
                    await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});   // warte bis setStateAsync meldet ist durch
                    await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});    // warte bis setStateAsync meldet ist durch
                    let res =  await setStateAsync('PFAD ZUM DATENPUNKT', {val:true, ack:false});    // warte bis setStateAsync meldet ist durch und gibt das ergebnis in die res variable
            
                } catch (error) {
                    return;
                }
            }
            

            man kann es noch mehr aufbohren und einen return wert ausgeben... und und und

            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #10

            @arteck

            ich bin da nicht so fit wie du - ich glaube

            • da müßte auch mit promises gearbeitet werden - was denkst du ?
            • evtl request mit axios ersetzen

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

            nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

            bahnuhrB 1 Antwort Letzte Antwort
            0
            • bahnuhrB bahnuhr

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

              Diese solltest du als async definieren, dann kannst du diese mit await aufrufen.

              Danke für die Info. Aber so richtig verstanden habe ich dies nicht.

              Nach meinem Verständnis muss das System doch zurück geben: Dateien sind kopiert oder mp3 ist erstellt.
              Also so ein return "erledigt".

              Nur wie ?

              AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von
              #11

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

              Aber so richtig verstanden habe ich dies nicht.

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

              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

              bahnuhrB 1 Antwort Letzte Antwort
              1
              • AlCalzoneA AlCalzone

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

                Aber so richtig verstanden habe ich dies nicht.

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

                bahnuhrB Online
                bahnuhrB Online
                bahnuhr
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #12

                @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


                Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                Danke.
                gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                ScreenToGif :https://www.screentogif.com/downloads.html

                1 Antwort Letzte Antwort
                0
                • liv-in-skyL liv-in-sky

                  @arteck

                  ich bin da nicht so fit wie du - ich glaube

                  • da müßte auch mit promises gearbeitet werden - was denkst du ?
                  • evtl request mit axios ersetzen

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

                  bahnuhrB Online
                  bahnuhrB Online
                  bahnuhr
                  Forum Testing Most Active
                  schrieb am zuletzt editiert von
                  #13

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

                  Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                  Danke.
                  gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                  ScreenToGif :https://www.screentogif.com/downloads.html

                  1 Antwort Letzte Antwort
                  0
                  • htreckslerH htrecksler

                    @hendrick Da ist ja wieder ein Sleep-Befehl? Oder ist der in dem Fall Kosmetik? Dem TE ging es ja darum eben diese nicht mehr zu benötigen, oder habe ich da etwas falsch verstanden?
                    Ich würde die await Funktion auch sehr gerne nutzen, habe mich aber noch nicht weiter damit beschäftigt.

                    H Offline
                    H Offline
                    Hendrick
                    schrieb am zuletzt editiert von Hendrick
                    #14

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

                    bahnuhrB 1 Antwort Letzte Antwort
                    0
                    • bahnuhrB bahnuhr

                      Hallo,
                      ich habe ein äußerst komplexes Script was Ansagen auf Yamaha Lautsprechern per Multicast wiedergibt.
                      Dies funktioniert auch.
                      Jedoch sind da zahlreiche timeout eingebaut, um z.B. zu warten auf:

                      • Dateien kopieren
                      • sayit mp3 kopieren
                      • Verzeichnis auf den Lautsprechern einstellen per api
                      • per media Server auf die Dateien zugreifen und dann abspielen auf den Lautsprechern.

                      Problem hierbei ist, dass die zahlreichen timeouts die Wiedergabe des textes dann zeitlich nach hinten verschiebt.

                      Die Idee ist nun, dass das System abwarten soll bis die Teilscripte erledigt sind und dann erst weiter geht.
                      Müsste doch mit async/await funktionieren. Nur ist dies mir noch ein bisschen zu hoch.

                      Die Scriptbausteine wären:

                      • mp3 per sayit erstellen,
                      • nach Erstellung mp3 diese kopieren auf ein bestimmtes Verzeichnis
                      • nach Ereldigung der Kopie prüfen ob der lautsprecher an ist
                      • wenn an, dann "server" einstellen
                      • wenn "server" eingestellt ist, dann das entsprechend Verzeichnis per yamaha api einstellen
                      • wenn alles eingestellt ist, dann Dateien abspielen
                      • wenn die Datei abgespielt sind, dann diese auf derm Verzeichnis löschen.
                      • nach löschen der Dateien den Lautsprecher wieder ausschalten.

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

                      mfg
                      Dieter

                      H Offline
                      H Offline
                      Hendrick
                      schrieb am zuletzt editiert von
                      #15

                      @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');
                              }
                          }
                      }
                      
                      bahnuhrB 1 Antwort Letzte Antwort
                      2
                      • H Hendrick

                        @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');
                                }
                            }
                        }
                        
                        bahnuhrB Online
                        bahnuhrB Online
                        bahnuhr
                        Forum Testing Most Active
                        schrieb am zuletzt editiert von
                        #16

                        @hendrick

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

                        Wenn noch jemand Beispiele hat nur her damit.


                        Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                        Danke.
                        gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                        ScreenToGif :https://www.screentogif.com/downloads.html

                        H 1 Antwort Letzte Antwort
                        0
                        • bahnuhrB bahnuhr

                          @hendrick

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

                          Wenn noch jemand Beispiele hat nur her damit.

                          H Offline
                          H Offline
                          Hendrick
                          schrieb am zuletzt editiert von
                          #17

                          @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 Antwort Letzte Antwort
                          0
                          • H 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.

                            bahnuhrB Online
                            bahnuhrB Online
                            bahnuhr
                            Forum Testing Most Active
                            schrieb am zuletzt editiert von
                            #18

                            @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


                            Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                            Danke.
                            gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                            ScreenToGif :https://www.screentogif.com/downloads.html

                            H 1 Antwort Letzte Antwort
                            0
                            • bahnuhrB bahnuhr

                              @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 Offline
                              H Offline
                              Hendrick
                              schrieb am zuletzt editiert von
                              #19

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

                              bahnuhrB 2 Antworten Letzte Antwort
                              0
                              • H Hendrick

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

                                bahnuhrB Online
                                bahnuhrB Online
                                bahnuhr
                                Forum Testing Most Active
                                schrieb am zuletzt editiert von
                                #20

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


                                Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                                Danke.
                                gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                                ScreenToGif :https://www.screentogif.com/downloads.html

                                H 1 Antwort Letzte Antwort
                                0
                                • H Hendrick

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

                                  bahnuhrB Online
                                  bahnuhrB Online
                                  bahnuhr
                                  Forum Testing Most Active
                                  schrieb am zuletzt editiert von
                                  #21

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


                                  Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                                  Danke.
                                  gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                                  ScreenToGif :https://www.screentogif.com/downloads.html

                                  H 1 Antwort Letzte Antwort
                                  0
                                  • bahnuhrB bahnuhr

                                    @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 Offline
                                    H Offline
                                    Hendrick
                                    schrieb am zuletzt editiert von
                                    #22

                                    @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 :relaxed:

                                    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 Antwort Letzte Antwort
                                    0
                                    • bahnuhrB bahnuhr

                                      @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 Offline
                                      H Offline
                                      Hendrick
                                      schrieb am zuletzt editiert von
                                      #23

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

                                      dslraserD 1 Antwort Letzte Antwort
                                      0
                                      • H Hendrick

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

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

                                        @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

                                        F 1 Antwort Letzte Antwort
                                        0
                                        • dslraserD 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

                                          F Offline
                                          F Offline
                                          fastfoot
                                          schrieb am zuletzt editiert von
                                          #25

                                          @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

                                          iobroker läuft unter Docker auf QNAP TS-451+
                                          SkriptRecovery: https://forum.iobroker.net/post/930558

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          904

                                          Online

                                          32.5k

                                          Benutzer

                                          81.8k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe