Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    1.1k

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    3.6k

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    6.2k

SetState(), wann genau wird das Objekt angelegt?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
6 Beiträge 3 Kommentatoren 2.1k 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: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

      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

              Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

              Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

              Mit deinem Input könnte dieser Beitrag noch besser werden 💗

              Registrieren Anmelden
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              411

              Online

              33.0k

              Benutzer

              83.6k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2026
              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