Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. SetState(), wann genau wird das Objekt angelegt?

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    SetState(), wann genau wird das Objekt angelegt?

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

      Guten Morgen,

      ich möchte meine Ereignisliste persistent gestalten.

      Dazu speichere ich das Array mit den Ereignissen in ein ioBroker Objekt mit setState(). Im selben Script wird das Objekt dann gelesen, damit beim Neustart die Ereignisliste nicht wieder bei null anfängt.

      Also:

      • setState() Objekt anlegen (wird ja nur ausgeführt, wenn es das Objekt noch nicht gibt)

      • getState() Objekt wieder einlesen (beim ersten Start, das angelegte Objekt, sonst die vorhandenen Daten)

      Das klappt auch prima, nur nicht beim Erststart mit noch nicht vorhandenen Objekt.

      Dann erhalte ich eine Warnung, dass es das Objekt noch nicht gibt und eine Fehlermeldung bei der Verarbeitung des Inhalts.

      Beim zweiten Start (und allen weiteren Starts) des Scripts funktioniert es prima.

      Erzeugt beim ersten Start des Scripts einen Fehler:

      createState('ereignisListe.events',"Ereignisliste angelegt");  // Die Ereignisliste als Array
      // ...
      var ereignisliste = getState('ereignisListe.events').val;
      
      
      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        @ruhr70:

        setState() Objekt anlegen (wird ja nur ausgeführt, wenn es das Objekt noch nicht gibt) `
        Wirklich ?

        Meiner Meinung nach wird das Objekt (der virtuelle Datenpunkt) nur mit createState() angelegt. setState() aktualisiert den Inhalt von object.newState.

        Anmerkung: Die Bezeichnung createState() erscheint etwas verwirrend, da ein Objekt erzeugt wird, für das in der Automatisierungstechnik der Begriff (virtueller) Datenpunkt gebräuchlich ist. Außerdem würde ich es begrüßen, wenn man virtuelle Datenpunkte unter dem Reiter "Objekte" mit Hilfe einer Eingabemaske, die alle zulässigen Objektparameter (natürlich nicht die dynamischen Parameter .newState und .oldState) enthält, erzeugen könnte.

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

          createState('ereignisListe.events',"Ereignisliste angelegt");
          

          Ist asynchron.

          In deinem Fall versuchst du getState aufzurufen für einen State, was noch nicht existiert.

          Richtig währe so:

          createState('ereignisListe.events',"Ereignisliste angelegt", function () {
              var ereignisliste = getState('ereignisListe.events').val;
          });
          
          

          Oder so:

          createState('ereignisListe.events',"Ereignisliste angelegt");
          
          function main() {
                 var ereignisliste = getState('ereignisListe.events').val;
                 //...
          }
          // warte bis alle States und Objekte angelegt werden.
          setTimeout(main, 500);
          
          
          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            Erst einmal Danke für die Rückmeldung! 🙂 und Lösung! 😄

            @paul53:

            Wirklich ?

            Meiner Meinung nach wird das Objekt (der virtuelle Datenpunkt) nur mit createState() angelegt. setState() aktualisiert den Inhalt von object.newState. `
            Ne, nicht wirklich 😉

            setState() war nur ein Tippfehler. ich meinte createState(), wie im Codeauszug aufgeführt.

            @Bluefox:

            createState('ereignisListe.events',"Ereignisliste angelegt");
            

            Ist asynchron.

            In deinem Fall versuchst du getState aufzurufen für einen State, was noch nicht existiert. `
            asynchrone bedeutet, dass während das Objekt angelegt wird, das Script weiter abgearbeitet wird?

            Ich hatte das schon vermutet und deshalb eine Pause von 1 Sekunde eingebaut (dachte ich, hatte ich wohl falsch gemacht).

            @Bluefox:

            Richtig währe so:

            createState('ereignisListe.events',"Ereignisliste angelegt", function () {
                var ereignisliste = getState('ereignisListe.events').val;
            });
            
            ```` `  
            

            Das hat nicht funktioniert.

            Im weiterem Verlauf erhalte ich dann den Fehler, das es ereignisliste nicht gibt.

            Kann es sein, dass die Variable nur in der Funktion existiert und deswegen später als nicht deklariert moniert wird?

            @Bluefox:

            Oder so:

            createState('ereignisListe.events',"Ereignisliste angelegt");
            
            function main() {
                   var ereignisliste = getState('ereignisListe.events').val;
                   //...
            }
            // warte bis alle States und Objekte angelegt werden.
            setTimeout(main, 500);
            
            ```` `  
            

            Das hat funktioniert. 🙂

            Ich hatte mir eine pause() Funktion gebaut, die anscheinend nicht funktioniert. Wieder asynchron?

            function pause(sek) {
                if (!sek) sek = 1000;
                var startTime = new Date().getTime();
                while ((new Date().getTime() - startTime < sek)) {
                }
            }
            

            und dann wie folgt aufgerufen:

            pause();
            var ereignisliste = getState('ereignisListe.events').val;
            
            

            1187_download.txt

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

              ` > ````

              createState('ereignisListe.events',"Ereignisliste angelegt", function () {
              var ereignisliste = getState('ereignisListe.events').val;
              });
              ````Das hat nicht funktioniert. `
              Es versteht sich natürlich dass Code dann so aussieht

              createState('ereignisListe.events',"Ereignisliste angelegt", function () {
                  var ereignisliste = getState('ereignisListe.events').val;
                  // Weitere operationen, z.b.
                  log(ereignisliste);
              });
              

              und nicht so:

              createState('ereignisListe.events',"Ereignisliste angelegt", function () {
                  var ereignisliste = getState('ereignisListe.events').val;
              });
              // Weitere operationen, z.b.
              log(ereignisliste);
              
              

              Die Variable "ereignisliste" existiert nur in der Funktion.

              ` > Ich hatte mir eine pause() Funktion gebaut, die anscheinend nicht funktioniert. Wieder asynchron?

              function pause(sek) {
                  if (!sek) sek = 1000;
                  var startTime = new Date().getTime();
                  while ((new Date().getTime() - startTime < sek)) {
                  }
              }
              
              ```` `  
              

              natürlich. Das ist extrem falsch. Das ist kein "C".

              Man muss immer sich dran erinnern, dass JS ist "quasi"single-threaded. D.h. so lange dein Kode hier wartet, kein weiteres wird dann ausgeführt. Ja du kannst so 1 Sekunde warten, aber createState ist nicht mal ausgeführt, weil du keine Zeit gegeben hast. Du hast sehr wichtige Sachen zu tun: warten 🙂 und das wird auch gemacht, so dass keine andere Funktion ausgeführt wird.

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

                Hi Bluefox,

                also danke, danke, danke, dass Du Dir immer wieder die Zeit nimmst.

                Das hat mich jetzt wirklich eine ganze Ecke vom Verständnis weitergebracht. 🙂

                Obwohl… asynchron und "single-threaded" ist für mich so ein kleines Paradoxon. 🙂

                Und über den Unterschied zu der Pause Funktion (da habe ich verstanden, warum das Blödsinn ist) und setTimeout muss ich auch noch einmal grübeln.

                Gruß

                Michael

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

                Support us

                ioBroker
                Community Adapters
                Donate

                603
                Online

                31.6k
                Users

                79.4k
                Topics

                1.3m
                Posts

                3
                6
                1900
                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