Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. SetState(), wann genau wird das Objekt angelegt?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

SetState(), wann genau wird das Objekt angelegt?

Scheduled Pinned Locked Moved Skripten / Logik
6 Posts 3 Posters 2.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ruhr70R Offline
    ruhr70R Offline
    ruhr70
    wrote on last edited by
    #1

    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;
    
    

    Adapter: Fritzbox, Unify Circuit
    Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

    1 Reply Last reply
    0
    • paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #2

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

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      1 Reply Last reply
      0
      • BluefoxB Offline
        BluefoxB Offline
        Bluefox
        wrote on last edited by
        #3
        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
        0
        • ruhr70R Offline
          ruhr70R Offline
          ruhr70
          wrote on last edited by
          #4

          Erst einmal Danke für die Rückmeldung! :) und Lösung! :D

          @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

          Adapter: Fritzbox, Unify Circuit
          Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

          1 Reply Last reply
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            wrote on last edited by
            #5

            ` > ````

            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
            0
            • ruhr70R Offline
              ruhr70R Offline
              ruhr70
              wrote on last edited by
              #6

              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

              Adapter: Fritzbox, Unify Circuit
              Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

              1 Reply Last reply
              0
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              551

              Online

              32.7k

              Users

              82.4k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Home
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe