Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Error/Bug
    4. Neue Datenpunkte ersten beim zweiten Skriptstart verfügbar?

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Neue Datenpunkte ersten beim zweiten Skriptstart verfügbar?

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

      Hallo,

      kenn jemand den Effekt, dass Datenpunkte im Skript zwar mit create State angelegt werden, aber erst beim zweiten Skriptstart verfügbar sind?

      Beispiel: Beim ersten Skriptstart wird die Schleife 10 mal durchlaufen, respektive endlos.

      Beim zweiten Start gar nicht.

      Es spielt keine Rolle, ob man auf getObject oder getState().netExist abfrägt.

      Wo ist mein Fehler?

      -JJ

      console.error("Start: ");
      const dp_Alive = "javascript.1.Alive.0x-Test"; // Javascript 1; für Instanz 0 entsprechend ändern. Datenpunkt nach zweitem Skriptstart manull löschen.
      for (i = 1; i < 10; i++) {
          if (!getObject(dp_Alive)) {
              console.warn("Loop: " + i);
              createState(dp_Alive, true);
              console.warn(getState(dp_Alive).val);
          }
      } 
      console.error("Ende.");
      stopScript();
      
      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        Funktionen, die eine Callback-Funktion enthalten können wie z.B. createState(), setState() usw., werden nur angeschubst, deren vollständige Ausführung aber nicht abgewartet. Wenn man das Ergebnis dieser Funktionen auswerten will, muss man das in der Callback-Funktion machen.

        console.error("Start: ");
        const dp_Alive = "Alive.0x-Test"; // Datenpunkt nach zweitem Skriptstart manull löschen.
        const id_Alive = "javascript.1." + dp_Alive;
        
        if (!getObject(id_Alive)) {
            createState(dp_Alive, true, function() {
                console.warn(getState(dp_Alive).val);
            });
        } 
        console.error("Ende.");
        

        Das Error-Log "Ende." wird vor dem Warning-Log mit dem Wert kommen

        1 Reply Last reply Reply Quote 0
        • J
          Jayvee last edited by

          Vielen Dank für die schnelle und kompetente Antwort.

          Wie "warte" ich an dieser Stelle am elegantesten darauf, dass die Datenpunkte beschrieben oder gelesen werden können, um Fehler durch verfrühte getState oder setState zu umgehen?

          Die Datenpunkte werden als Trigger zum Start weiterer Aktionen verwendet. Wenn ich 12 Datenpunkte brauche, muss ich dann einen 13. anlegen, mit FALSE initieren, warten bis der Callback kommt und dann mit TRUE eine Subscription auslösen oder gibt es noch was eleganteres?

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

            @JJJ:

            Die Datenpunkte werden als Trigger zum Start weiterer Aktionen verwendet `
            Jeden Datenpunkt auf change: 'any' triggern, was die default Einstellung bei dem on-Muster als Objekt ist. Dann wird sofort nach Erstellen des Datenpunktes das erste Mal getriggert.

            on({id: id_Alive}, function(dp) { // Triggert bei jeder Aktualisierung des Zeitstempels
               hier das Datenpunkt-Objekt (dp) auswerten
            });
            

            Ein Triggern erfolgt immer erst dann, wenn der Trigger-Datenpunkt verfügbar ist (auch für getState() und setState()).

            1 Reply Last reply Reply Quote 0
            • J
              Jayvee last edited by

              Alles klar, danke.

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

                @paul53:

                Funktionen, die eine Callback-Funktion enthalten können wie z.B. createState(), setState() usw., werden nur angeschubst, deren vollständige Ausführung aber nicht abgewartet. Wenn man das Ergebnis dieser Funktionen auswerten will, muss man das in der Callback-Funktion machen.

                console.error("Start: ");
                const dp_Alive = "Alive.0x-Test"; // Datenpunkt nach zweitem Skriptstart manull löschen.
                const id_Alive = "javascript.1." + dp_Alive;
                
                if (!getObject(id_Alive)) {
                    createState(dp_Alive, true, function() {
                        console.warn(getState(dp_Alive).val);
                    });
                } 
                console.error("Ende.");
                

                Das Error-Log "Ende." wird vor dem Warning-Log mit dem Wert kommen `

                Man muss gar nicht prüfen ob die variable existiert. CreateState macht das auch.

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

                  Richtig ist````

                  createState(dp_Alive, () =>{
                  // hier schreibe ich immer meine Logik.

                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • J
                    Jayvee last edited by

                    Danke Bluefox.

                    Und wenn mehrere Datenpunkte anzulegen sind?

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

                      @JJJ:

                      Und wenn mehrere Datenpunkte anzulegen sind? `
                      Vorschlag:

                      const dp1 = '...';
                      ...
                      const dpN = '...';
                      const anzahlDP = N;  // für N die tatsächliche Datenpunkt-Anzahl einsetzen
                      
                      var cnt = 0;
                      
                      function auswertung() {
                         cnt++;
                         if(cnt == anzahlDP) {
                            // Hier erfolgt die Auswertung
                         }
                      } 
                      
                      createState(dp1, true, auswertung);
                      ...
                      createState(dpN, true, auswertung);
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • J
                        Jayvee last edited by

                        Ist etwas gewöhnungsbedürftig aber passt. Vielen Dank.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        744
                        Online

                        31.6k
                        Users

                        79.5k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        688
                        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