Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. SetState() nach createState() schreibt nichts?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    SetState() nach createState() schreibt nichts?

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

      @Zeitfraktur:

      @ruhr70:

      Du kannst das Skript so schreiben, dass die Datenpunkte angelegt werden und alle folgenden Kommandos verzögert `
      Wie lange sollte man denn verzögern?

      Btw, ruft man deshalb Funktionen im Script z.B. via 'setTimeout(meineFunktion, 500);' auf? Oder hat das noch andere Gründe? `

      Das kann diverse Gründe haben.

      Beim hue Skript mit den dynamischen Lichtwechsel steuere ich z.B. den Farbwechsel damit.

      In anderen Skripten lege ich erst alle Datenpunkte an und packe das eigentliche "Programm" in eine Funktion, die ich dann mit setTimeout() verzögert aufrufe.

      Gesendet von iPhone mit Tapatalk

      1 Reply Last reply Reply Quote 0
      • ruhr70
        ruhr70 last edited by

        @apollon77:

        Du machst es so wie unter https://github.com/ioBroker/ioBroker.ja … reatestate im dritten beispiel. Also eine Callback-Funktion am createState die wird ausgeführt wenn der State angelegt ist (aber auch nur dann). `

        Danke für den Hinweis!

        Wie würdest Du es aufbauen, wenn Du in dem Skript mehrere Datenpunkte anlegen musst, z.B. fünf?

        1 Reply Last reply Reply Quote 0
        • apollon77
          apollon77 last edited by

          Wenn die Anlage nicht voneinander abhängt schreibst DU die createState-Aufrufe alle auf die gleiche "Ebene" und nicht kaskadierend in die callback-Funktionen. Falls Du (aus welchem grund auch immer) sicherstellen musst das die Anlage der Datenpunkte nacheinander erfolgt oder irgendwelche Logik erst ausgeführt wird wenn alle Datenpunkte da sind, dann kannst Du die createState jeweils in die Callback des vorhergehenden machen.

          Aber am Ende musst DU mal testen ob der callback auch ausgeführt wird wenn der State schon existiert 🙂 Das weiss ich gerade nicht.

          1 Reply Last reply Reply Quote 0
          • P
            Pman last edited by

            Ich glaube es gab mal einen Bug, dass callback nicht ausgeführt wurde, wenn der State schon existiert. Bin aber der Meinung, dass das schon lange gefixt ist.

            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              @apollon77:

              Wenn die Anlage nicht voneinander abhängt schreibst DU die createState-Aufrufe alle auf die gleiche "Ebene" und nicht kaskadierend in die callback-Funktionen. Falls Du (aus welchem grund auch immer) sicherstellen musst das die Anlage der Datenpunkte nacheinander erfolgt oder irgendwelche Logik erst ausgeführt wird wenn alle Datenpunkte da sind, dann kannst Du die createState jeweils in die Callback des vorhergehenden machen.

              Aber am Ende musst Du mal testen ob der callback auch ausgeführt wird wenn der State schon existiert 🙂 Das weiss ich gerade nicht. `

              Ich muss da noch einmal nachhaken…

              (will endlich mal tiefer in das Callback-Thema einsteigen).

              Folgende Funktion, die einen Haufen Datenpunkte für diverse Geräte anlegt:

              ! ```
              `function dpAnlegen() {
              var dfSt = defaultRadiostation;
              var fc = forecreation; //forecreation;
              var deviceType,essid,macAddress,swVersion,deviceTypeTxt,capabilities;
              var echo;
              // for (var echo in echos) {
              for(var i = 0; i < alexaDeviceObj.devices.length; i++) {
              var pfad = otherDevicePfad;
              echo = alexaDeviceObj.devices[i].dpName;
              if(alexaDeviceObj.devices[i].anlegen) {
              pfad = devicePfad;
              echos[echo] = {"deviceType":alexaDeviceObj.devices[i].deviceType,"deviceSerialNumber":alexaDeviceObj.devices[i].serialNumber};
              createState(pfad + echo +".volume", 40, false, {name:"Volume (0-100)", type:"number", role:"control.value"});
              createState(pfad + echo +".pause", false, fc, {name:"Pause", type:"boolean", role:"button"});
              createState(pfad + echo +".play", false, fc, {name:"Play", type:"boolean", role:"button"});
              createState(pfad + echo +".next", false, fc, {name:"Next (nächster Titel)", type:"boolean", role:"button"});
              createState(pfad + echo +".previous", false, fc, {name:"Previous (vorheriger Titel)", type:"boolean", role:"button"});
              createState(pfad + echo +".forward", false, fc, {name:"Forward (Hörbuch 30 Sekunden vor)", type:"boolean", role:"button"});
              createState(pfad + echo +".rewind", false, fc, {name:"Rewind (Hörbuch 30 Sekunden zurück)",type:"boolean", role:"button"});
              createState(pfad + echo +".shuffle", false, fc, {name:"Shuffel an/aus (true/false)", type:"boolean", role:"switch"});
              createState(pfad + echo +".Last_Status","init", fc, {name:"Letzter Status", type:"string", role:"value"});
              createState(pfad + echo +".radio", false, fc, {name:"Default Radiostation an/aus", type:"boolean", role:"switch"});
              createState(pfad + echo +".tunein", dfSt, fc, {name:"tunein Radiosenderkennung", type:"string", role:"control.value"});
              }
              essid = alexaDeviceObj.devices[i].essid;
              macAddress = alexaDeviceObj.devices[i].macAddress;
              swVersion = alexaDeviceObj.devices[i].softwareVersion;
              deviceTypeTxt = deviceTypeStr(alexaDeviceObj.devices[i].deviceType);
              deviceType = alexaDeviceObj.devices[i].deviceType;
              capabilities = JSON.stringify(alexaDeviceObj.devices[i].capabilities);

                      createState(pfad + echo +"._info.device_type_str",  deviceTypeTxt,  true,   {name:"Amazon Echo Typ",            type:"string",      role:"value"});
                      createState(pfad + echo +"._info.device_type",      deviceType,     fc,     {name:"Amazon Echo deviceType",     type:"string",      role:"value"});
                      createState(pfad + echo +"._info.essid",            essid,          true,   {name:"SSID des WLANs",             type:"string",      role:"value"});
                      createState(pfad + echo +"._info.macAddress",       macAddress,     fc,     {name:"MAc-Adresse des Echos",      type:"string",      role:"value"});
                      createState(pfad + echo +"._info.softwareVersion",  swVersion,      true,   {name:"Softwareversion des Echos",  type:"string",      role:"value"});
                      createState(pfad + echo +"._info.capabilities",     capabilities,   true,   {name:"Fähigkeiten des Echos",      type:"string",      role:"value"});
              }
              log("--- Alexa Kommandos - Datenpunkte angelegt ---");
              log(JSON.stringify(echos));
              

              }`

              ! In der Funktion "davor" versuche ich sie mit:
              ~~[code]~~return null, dpAnlegen(function () {setOn()}); [/code]
              aufzurufen.
              ! Die Funktion dpAnlegen() wird aufgerufen, die Funktion setOn(), die die ganzen Subskription setzt, nicht mehr.
              ! (Die Datenpunkte waren schon angelegt).
              ! Habe ich einen Denkfehler drin, sprich was falsch oder gibt es einen "Best Practice Tipp"?[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

              1 Reply Last reply Reply Quote 0
              • apollon77
                apollon77 last edited by

                Du übergibst deinem "dpAnlegen" ein en Parameter beim AUfruf. Aber die Methode an sich hat dann keinen Parameter. Also wird der nicht übergeben und du machst ja auch nichts damit.

                Du musst:

                function dpAnlegen(callback) {

                definieren und dann wenn in dpAnlegen alles fertig ist dann ein "callback();" einbauen das die callback-Funtion aufgerufen wird.

                Ein Kommentar übrigens aber: Du rufst in deiner dpAnlegen wieder alle createStates "synchron" auf. Das bedeutet: Wenn die die Schleife in dpAnlegen abgearbeitet hast ist von den createStates pot,. noch nichts abgearbeitet worden. Erst wenn Di dem Prozess wieder "freie Zeit" gibst hat er Zeit die ganzen Dinge dann asynchron abzuarbeiten.

                In einer asynchronen Welt muss man das etwas Trickreicher machen.

                Vllt kannst Du Dir in https://stackoverflow.com/questions/841 … ys-or-objs (die zweite Antwort) anregungen holen ... leider ist Zeit jetzt gerade knapp ein Beispiel zu basteln

                1 Reply Last reply Reply Quote 0
                • ruhr70
                  ruhr70 last edited by

                  Danke für die Antwort! Das gibt mir was zum grübeln.

                  @apollon77:

                  Du übergibst deinem "dpAnlegen" ein en Parameter beim AUfruf. Aber die Methode an sich hat dann keinen Parameter. Also wird der nicht übergeben und du machst ja auch nichts damit.

                  Du musst:

                  function dpAnlegen(callback) {

                  definieren und dann wenn in dpAnlegen alles fertig ist dann ein "callback();" einbauen das die callback-Funtion aufgerufen wird. `

                  So hatte ich das vorher. Aber die ganzen createState() waren dann beim callback(); anscheinend noch nicht fertig.

                  @apollon77:

                  Ein Kommentar übrigens aber: Du rufst in deiner dpAnlegen wieder alle createStates "synchron" auf. Das bedeutet: Wenn die die Schleife in dpAnlegen abgearbeitet hast ist von den createStates pot,. noch nichts abgearbeitet worden. Erst wenn Di dem Prozess wieder "freie Zeit" gibst hat er Zeit die ganzen Dinge dann asynchron abzuarbeiten. `

                  Das habe ich beim Probieren auch vermutet. Danke, für die Bestätigung.

                  Ich war so naiv, dass das mit callbacks am Ende einer Funktion irgendwie anders funktioniert 🙂

                  @apollon77:

                  In einer asynchronen Welt muss man das etwas Trickreicher machen.

                  Vllt kannst Du Dir in https://stackoverflow.com/questions/841 … ys-or-objs (die zweite Antwort) anregungen holen ... leider ist Zeit jetzt gerade knapp ein Beispiel zu basteln `

                  Auch dafür danke. Die zweite Antwort sieht interessant aus. Allerdings verursacht das ganze asynchrone Thema und die Callbacks einen Knoten im Kopf. Ich habe keine eile und schau mal, ob ich damit zurecht komme 🙂

                  1 Reply Last reply Reply Quote 0
                  • apollon77
                    apollon77 last edited by

                    Ja, das asynchrone Zeug macht einmal nen Knoten im Hirn bis man es mal verarbeitet hat 🙂 Aber dann ists logisch.

                    1 Reply Last reply Reply Quote 0
                    • ruhr70
                      ruhr70 last edited by

                      @apollon77:

                      In einer asynchronen Welt muss man das etwas Trickreicher machen.

                      Vllt kannst Du Dir in https://stackoverflow.com/questions/841 … ys-or-objs (die zweite Antwort) anregungen holen ... leider ist Zeit jetzt gerade knapp ein Beispiel zu basteln `

                      Ich habe mir jetzt die Zeit genommen und das Beispiel von Deinen Link (Danke!) mir näher angesehen.

                      Der Knoten im Kopf ist nicht weg 😉

                      Als Ergebnis gibt es nun eine Funktion createStates(), die aus einem Array die Datenpunkte (hoffentlich) nacheinander anlegt.

                      var forceCreation = true;
                      
                      var datenpunkteArr =[
                          {   "name":             'test.a',
                              "initialValue":     true,
                              "forceCreation":    forceCreation,
                              "common":           {name:"Mein Boolean DP",type:"boolean", role:"value"}
                          },
                          {   "name":             'test.b',
                              "initialValue":     40,
                              "forceCreation":    forceCreation,
                              "common":           {name:"mein Number DP", type:"number",  role:"value"}
                          },
                          {   "name":             'test.c',
                              "initialValue":     "hallo",
                              "forceCreation":    forceCreation,
                              "common":           {name:"Mein String DP", type:"string",  role:"value"}
                          }
                      ];
                      
                      function createStates(arr, func, cb) {
                          var doneCounter = 0;
                          arr.forEach(function alleDpBearbeiten(obj) {
                              func(obj.name, obj.initialValue, obj.forceCreation, obj.common, function () {
                                  doneCounter += 1;
                                  log(doneCounter+": " + obj.name+" mit Wert: " + obj.initialValue + " ("+obj.common.type+") angelegt");
                                  if (doneCounter === arr.length) {
                                      cb("alle Datenpunkte angelegt"); // mit der Funktion (callback) geht es weiter, wenn alles erledigt ist
                                  }
                              });
                          });
                      }
                      
                      createStates(datenpunkteArr, createState, log);
                      
                      1 Reply Last reply Reply Quote 0
                      • apollon77
                        apollon77 last edited by

                        Sieht sinnig aus … passts denn?

                        1 Reply Last reply Reply Quote 0
                        • ruhr70
                          ruhr70 last edited by

                          @apollon77:

                          Sieht sinnig aus … passts denn? `

                          ja und nein… :?

                          Die Datenpunkte werden anscheinend alle brav hintereinander angelegt. Beim Alexa-Steuerungs-Skript sind es bei mir 98 Stück.

                          Das scheint zu funktionieren. Ich bekomme 98x mal hintereinander brav eine Rückmeldung von jedem createState, wenn dieses fertig ist.

                          Als Callback für ich dann danach nicht das log() aus dem Beispiel auf, sondern die Funktion, die die Subscriptions anlegt.

                          ! function setOn() { var reg = new RegExp("^javascript\\."+instance+"\\." + devicePfad.replace('.', '\\.') + ".*\\.(volume|pause|play|next|forward|rewind|shuffle|tunein|radio|previous)"); on({"id":reg , "change": "any"}, function (obj) { var objArr = obj.id.match(/(^.+)\.(.+)\.(.+)$/, ""); //Aufteilung in Pfad + Device + CMD var device = objArr[2]; var cmd = objArr[3]; ! switch (cmd) { case "radio": if(obj.state.val) { // default Radiostation einschalten setState(devicePfad + device +".tunein",defaultRadiostation); return; } else { // Musik auf Pause. setState(devicePfad + device +".pause",true); return; } break; ! // Buttons, true zum auslösen. Werden danach wieder auf flase gesetzt case "pause": case "play": case "next": case "forward": case "rewind": case "previous": if(getState(obj.id).val) setState(obj.id,false); // Button wieder auf false zurücksetzen, wenn er true war if(obj.state.val) alexaCommand(device,cmd,true); // Kommando war ein true -> Kommando ausführen break; ! // Switches oder Wert case "shuffle": case "volume": case "tunein": alexaCommand(device,cmd,obj.state.val); break; ! default: log("Kommando << "+cmd+" >> im Skript nicht behandelt","warn"); break; } ! }); log("--- Subscriptions angelegt ---"); } !

                          Und hier kommt der Punkt, den ich nicht verstehe. 😞

                          Das Skript verhält sich so, wie vorher.

                          Wenn bei der ersten Ausführung des Skriptes die Datenpunkte angelegt werden oder das Skript mir forceCreation=true ausgeführt wird, greift das on(), obwohl es erst nach den ganzen createStates ausgeführt wird.

                          D.h. wenn ein Datenpunkt neu angelegt wird, wird die Subscriptions ausgeführt.

                          Ich bin der Meinung, dass es nicht mehr an den asynchronen Aufruf liegen dürfte. Aber warum wird trotzdem "nachträglich" die Subscriptions ausgeführt?

                          Bei der Skriptausführung sieht das Log so aus:

                          22:33:17.972	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: 96: alexa_device_command.other_devices.Michael_s_echosim_BETA._info.device_type_str mit Wert: Gerät unbekannt (string) angelegt
                          22:33:17.972	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: 97: alexa_device_command.other_devices.Michael_s_echosim_BETA._info.softwareVersion mit Wert: 0 (string) angelegt
                          22:33:17.972	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: 98: alexa_device_command.other_devices.Michael_s_echosim_BETA._info.capabilities mit Wert: ["SUPPORTS_CONNECTED_HOME_CLOUD_ONLY","KINDLE_BOOKS","AUDIBLE","AUDIO_PLAYER","SLEEP","TUNE_IN","CHANGE_NAME","I_HEART_RADIO","PERSISTENT_CONNECTION","AMAZON_MUSIC","POPTART","TIMERS_AND_ALARMS"] (string) angelegt
                          22:33:17.972	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: --- Alexa Kommandos - Datenpunkte angelegt ---
                          22:33:19.964	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: --- Subscriptions angelegt ---
                          22:33:20.388	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: --- Alexa Kommandos - Skript initalisiert und bereit ---
                          

                          Die Einträge …,96,97,98 werden im Callback des createStates ausgeführt.

                          die Subscriptions erst, wenn alles angelegt wurde.

                          1 Reply Last reply Reply Quote 0
                          • apollon77
                            apollon77 last edited by

                            Woran siehst DU das die Subscriptions vorher schon ausgeführt werden?

                            1 Reply Last reply Reply Quote 0
                            • ruhr70
                              ruhr70 last edited by

                              Wenn die Datenpunkte das erste Mal angelegt werden, werden alle Datenpunkte einmal angesteuert.

                              Ich sehe die Kommandos, die die Subscriptions auslösen und alle Alexa Lautsprecher gehen an und spielen Radio.

                              1 Reply Last reply Reply Quote 0
                              • apollon77
                                apollon77 last edited by

                                Heisst, er reagiert auf das setzen der initialen Werte auch wenn das "on" vom Ablauf her noch gar nicht gesetzt wurde …hm ... ich schau morgen mal nach ...

                                1 Reply Last reply Reply Quote 0
                                • ruhr70
                                  ruhr70 last edited by

                                  @apollon77:

                                  Heisst, er reagiert auf das setzen der initialen Werte auch wenn das "on" vom Ablauf her noch gar nicht gesetzt wurde …hm ... ich schau morgen mal nach ... `

                                  Genau. Ich habe das heute Morgen noch einmal getestet. Mal klappt es, mal klappt es nicht.

                                  Als ob die Subscriptions manchmal noch aktiv wären, obwohl das Skript neu gestartet wurde.

                                  [EDIT] Auszug des erweiterten Logs im Fehlerfall:

                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: 96: alexa_device_command.other_devices.Michael_s_echosim_BETA._info.device_type mit Wert: A3H674413M2EKB (string) angelegt
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: 97: alexa_device_command.other_devices.Michael_s_echosim_BETA._info.essid mit Wert: null (string) angelegt
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: 98: alexa_device_command.other_devices.Michael_s_echosim_BETA._info.macAddress mit Wert: null (string) angelegt
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: --- Alexa Kommandos - Datenpunkte angelegt ---
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: --- Subscriptions angelegt ---
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: Kommando für: Arbeitszimmer_Echo_Dot_sw
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: Kommando: {"type":"tunein","station":"s100198"}
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: Data to request body: {"type":"tunein","station":"s100198"}
                                  06:54:32.661	[info]	javascript.1 script.js.Steuerung.Alexa_cURL_Kommandos: Kommando für: Kueche_Echo_Dot_ws
                                  ... usw.
                                  

                                  Die Datenpunkte haben alle einzeln zurückgemeldet,dass sie angelegt wurden.

                                  Die Subscriptions werden angelegt.

                                  Die Subscriptions reagieren auf die gerade vorher angelegten Werte.

                                  1 Reply Last reply Reply Quote 0
                                  • apollon77
                                    apollon77 last edited by

                                    ich hab da nur eine Idee, dass am Ende die "setStates" die beim ANlegen der States passieren ja auch asynchron sind und daher bei der Ausführung durchaus dann nach den "on"s ausgeführt werden könnten.

                                    Um das ggf rauszufinden wäre eine Idee das anlegen der subscriptions um 1-2 Sekunden zu verzögern … also ein "setTimeout(function ..., 2000) einzubauen. Das sollte/könnte den setStates genug Zeit geben um auch abgearbeitet zu sein.

                                    Dann sieht man ob es daran lag ...

                                    Oder Du baust eine "initDone" Variable ein die am Anfang "false" ist und nach Anlegen aller Subscriptions (ggf zeitverzögert) auf "true" geht und in deinem Subscription code prüfst Du ob die true ist und machst nur dann die Logik

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

                                      setState hat auch eine callback-Methode. Man könnte das so handhaben (Pseudocode, => steht für Callback):

                                      createAllStates():
                                        für jeden State:
                                          createState => Alle States angelegt? Dann setAllStates()
                                      
                                      setAllStates():
                                        für jeden State:
                                          createState => Alle States gefüllt? Dann init()
                                      
                                      init():
                                        subscriptions anlegen
                                      

                                      @OP: Welche Node-Version verwendest du? Wenn es mindestens 4.X ist kannst du auch auf Promises gehen. Ich poste dir dann gerne Code. Dann würde sich die Initialisierung grob wie folgt gestalten inklusive Ablaufkontrolle:

                                      var createStates = [...]; // Array mit Promises füllen, die States anlegen
                                      var fillStates = [...]; // Array mit Promises füllen, die States füllen
                                      Promise.all(createStates)
                                        .then(function() {return Promise.all(fillStates)})
                                        .then(function() { /* Subscriptions und Skript initialisieren */ })
                                        ;
                                      
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • apollon77
                                        apollon77 last edited by

                                        Ich glaube er nutzt hier die Möglichkeit automatisch einen ersten Wert bei createState zu setzen … gerade nachgeschcut. Der clalback sollte dann erst aufgerufen werden wenn auch das setState durch ist ... Also komisch ists

                                        1 Reply Last reply Reply Quote 0
                                        • ruhr70
                                          ruhr70 last edited by

                                          @apollon77 und @AlCalzone: erst einmal herzlichenDank für Eure Gedanken und Mühe! :!: 🙂

                                          Vorweg der aktuelle Stand, gerade getestet:

                                          • das Problem ist nicht immer reproduzierbar 😞

                                          • alle Versuche vorhin waren so, wie sie sein sollten

                                          Ich vermute, dass es ggf. an der Auslastung des Rechners liegt und dass das Setzen des initValue nicht im callback des createState() berücksichtigt ist.

                                          Also immer noch in Teilen asynchrone :?:

                                          @apollon77:

                                          ich hab da nur eine Idee, dass am Ende die "setStates" die beim ANlegen der States passieren ja auch asynchron sind und daher bei der Ausführung durchaus dann nach den "on"s ausgeführt werden könnten. `

                                          Du meinst, da ich das initialValue beim ersten Anlegen oder beim Überschreiben (nicht der normale Vorgang, nur wenn ich Änderungen in den Bezeichnungen durchgeführt habe) verwende, ruft der Javascript-Adapter innerhalb der Funktion createState() ein setState() auf und dieses ist im Callback von createState() noch nicht berücksichtigt?

                                          Ich habe mal in den Code vom Javascript-Adapter reingeschaut.

                                          Im createState gibt es u.a. diese Zeile:

                                          if (initValue !== undefined) {
                                              adapter.setState(name, initValue, callback);
                                          

                                          Ob das dann beim callback vom createState mit berücksichtig ist… da bin ich definitiv raus 😮

                                          @apollon77:

                                          Um das ggf rauszufinden wäre eine Idee das anlegen der subscriptions um 1-2 Sekunden zu verzögern … also ein "setTimeout(function ..., 2000) einzubauen. Das sollte/könnte den setStates genug Zeit geben um auch abgearbeitet zu sein.

                                          Dann sieht man ob es daran lag ... `

                                          Hatte ich gemacht, bevor ich oben gepostet hatte. Hilft etwas… aber nicht immer.

                                          @apollon77:

                                          Oder Du baust eine "initDone" Variable ein die am Anfang "false" ist und nach Anlegen aller Subscriptions (ggf zeitverzögert) auf "true" geht und in deinem Subscription code prüfst Du ob die true ist und machst nur dann die Logik `

                                          Verstehe ich nicht ganz. Das Problem liegt doch vorher oder?

                                          Es sollten alles States gesetzt sein, bevor die Subscritions angelegt werden.

                                          @AlCalzone:

                                          setState hat auch eine callback-Methode. Man könnte das so handhaben (Pseudocode, => steht für Callback): `

                                          Das wäre die Variante, wenn das createState wirklich die dort enthaltenen setStates asynchrone aufruft?

                                          Also auf initialValue verzichten.

                                          Dann kommt hinzu, dass vorher geprüft werden muss, ob die Werte gesetzt werden müssen (nur beim ersten Start oder bei forcecreation)?

                                          @AlCalzone:

                                          @OP: Welche Node-Version verwendest du? Wenn es mindestens 4.X ist kannst du auch auf Promises gehen. Ich poste dir dann gerne Code. Dann würde sich die Initialisierung grob wie folgt gestalten inklusive Ablaufkontrolle: `

                                          Ich selbst verwende 4.x. Ich überlege, ob es sich lohnt das Skript als Prototype für einen Adapter zu verwenden.

                                          Denke da an die Abwärtskompatibelität…

                                          Da ich das mit den Callbacks() wohl nicht mehr so schnell in den Kopf bekomme, bietet es sich an doch mal Promises anzusehen 😉

                                          Kann das direkt verwendet werden oder muss da noch was geladen werden?

                                          Aber prinzipiell würde ich gerne verstehen, woran es jetzt gerade das Problem ist 😉

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

                                            @ruhr70:

                                            Da ich das mit den Callbacks() wohl nicht mehr so schnell in den Kopf bekomme, bietet es sich an doch mal Promises anzusehen 😉

                                            Kann das direkt verwendet werden oder muss da noch was geladen werden? `
                                            Ab Node 4.x ist das eigentlich nativ unterstützt. Das Skript läuft dann aber nicht unter einer 0.10.x-Umgebung, das muss dir klar sein.

                                            Ich sehe zu, dass ich dir heute Abend mal ein bisschen Code bastele zum Testen.

                                            @ruhr70:

                                            Aber prinzipiell würde ich gerne verstehen, woran es jetzt gerade das Problem ist 😉 `
                                            Dass dein Problem nicht immer reproduzierbar ist, klingt für mich nach Timing-Problemen durch asynchronen Programmablauf. Wenn eine Aktion dann mal länger dauert, hakts woanders.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            813
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

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