Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Zeit für ein setState? [gelöst]

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Zeit für ein setState? [gelöst]

    This topic has been deleted. Only users with topic management privileges can see it.
    • SKB
      SKB Developer Most Active last edited by SKB

      Hi Zusammen,
      ich habe mal eine Verständnisfrage. Wenn ich einen Datenpunkt auslese, diesen abändere und danach nochmals auslese, müsste ich ja einen anderen Wert bekommen, oder?

      Wieso erscheint bei diesem Mini-Skript denn immer derselbe Wert?
      Der Datenpunkt ist vom Typ "number"

      var dp = "javascript.0.Test.Test";
      var value = getState(dp).val;
      log(value);
      setState(dp,parseFloat(getState(dp).val) + 10,true);
      var newvalue = getState(dp).val;
      log(newvalue);
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @SKB last edited by

        @SKB sagte:

        setState(dp,parseFloat(getState(dp).val) + 10,true);
        var newvalue = getState(dp).val;

        Das funktioniert deshalb nicht, weil setState() asynchron ausgeführt wird. Bei Einlesen des gleichen Datenpunktes ist setState() noch nicht fertig, man erhält also den alten Wert.

        SKB 1 Reply Last reply Reply Quote 1
        • SKB
          SKB Developer Most Active @paul53 last edited by

          @paul53
          Danke für die Ausführung. Das hatte ich fast vermutet. Kann man eine Kontrolle erstellen, in der man dann prüft, wann setState fertig ist bzw. den aktuellen Wert liefern kann?

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

            @SKB sagte:

            Kann man eine Kontrolle erstellen, in der man dann prüft, wann setState fertig ist bzw. den aktuellen Wert liefern kann?

            Wozu soll das gut sein ? Innerhalb eines Scripts kann man Scriptvariablen verwenden.

            EDIT: Man kann setState() auch eine Callback-Funktion mitgeben, die ausgeführt wird, wenn setState() fertig ist.

            setState(dp,parseFloat(getState(dp).val) + 10,true, function() {
               var newvalue = getState(dp).val;
               log(newvalue);
            });
            
            SKB 1 Reply Last reply Reply Quote 0
            • SKB
              SKB Developer Most Active @paul53 last edited by

              @paul53
              Das wäre z.B. sinnvoll, wenn man mehrere setState's ausführt und dann eine Addition der neuen Werte vollziehen möchte.
              Klar, das geht auch in einem Skript - aber es könnten ja auch andere Skripte den Datenpunkt lesen wollen und dann z.B. mit einem on-listening auf dem Datenpunkt neue Werte irgendwo hin schreiben.

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

                @SKB sagte:

                andere Skripte den Datenpunkt lesen wollen

                Dort triggert man auf den Datenpunkt und bekommt so die Änderung mit.

                @SKB sagte in Zeit für ein setState?:

                wenn man mehrere setState's ausführt und dann eine Addition der neuen Werte vollziehen möchte.

                Addition von Scriptvariablen, die die neuen Werte enthalten.

                SKB 1 Reply Last reply Reply Quote 0
                • SKB
                  SKB Developer Most Active @paul53 last edited by

                  @paul53
                  Richtig. Aber sagen wir mal, man hört auf einem Datenpunkt mit on und erwartet, dass auch die anderen Datenpunkte die neuen Werte enthalten, die soeben geschrieben (hätten) werden sollen. Dann kann es ja passieren, das man eben nicht alle aktellen Werte bekommt, da asynchron geschrieben wird.

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

                    @SKB sagte:

                    Dann kann es ja passieren, das man eben nicht alle aktellen Werte bekommt, da asynchron geschrieben wird.

                    Der Fall ist mir noch nicht untergekommen. Notfalls verzögert man die Abfrage der anderen Datenpunkte etwas (50 ms).

                    SKB 1 Reply Last reply Reply Quote 1
                    • SKB
                      SKB Developer Most Active @paul53 last edited by

                      @paul53
                      Das wäre jetzt auch meine einzige Idee. Danke für die Ausführung!

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

                        @SKB
                        Habe meine Antwort oben noch um die Callback-Funktion von setState() ergänzt.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        483
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        javascript
                        2
                        10
                        281
                        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