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. SetState(), wann genau wird das Objekt angelegt?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    14
    1
    210

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.8k

SetState(), wann genau wird das Objekt angelegt?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
6 Beiträge 3 Kommentatoren 2.0k Aufrufe
  • Ä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.
  • ruhr70R Offline
    ruhr70R Offline
    ruhr70
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • BluefoxB Offline
        BluefoxB Offline
        Bluefox
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • ruhr70R Offline
          ruhr70R Offline
          ruhr70
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • ruhr70R Offline
              ruhr70R Offline
              ruhr70
              schrieb am zuletzt editiert von
              #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 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

              908

              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