Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Wert nur schreiben, wenn sich dieser geändert hat

    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

    [gelöst] Wert nur schreiben, wenn sich dieser geändert hat

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

      Ich möchte bestimmte Werte nur dann schreiben (aktualisieren) wenn sich diese tatsächlich geändert haben.

      Bisher habe ich das in dieser Form (Beispiel) gelöst.

          if (getState(ValueNoiseFarbe).val != sFarbe) {
              setState(ValueNoiseFarbe, sFarbe, true);
          }
      

      Allerdings bin ich der Meinung, schon einmal hier im Forum eine elegantere Lösung gesehen zu haben. Nur leider habe ich mir die Stelle nicht gemerkt und jetzt finde ich den Post nicht mehr.

      Frage: Gibt es eine elegantere / kürzere Lösung?

      Ro75.

      mickym paul53 2 Replies Last reply Reply Quote 0
      • mickym
        mickym Most Active @Ro75 last edited by mickym

        @ro75 man fragt nicht einen Wert ab, sondern läßt diesen triggern.Schau die mal die Syntax von on(id,…) an.

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

          @mickym das ist mir bekannt und mache ich auch so. Mir ging es um diesen Code-Schnipsel und die Frage ob es eleganter geht.

          mickym 1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active @Ro75 last edited by mickym

            @ro75 verstehe ich nicht, hab ich doch gerade gesagt, statt if getState - den DP triggern lassen, wenn sich der geändert hat.

            on({
                       id: 0_userdata.0.test,
                      change: ne}, 
                     function () {
                              setState(ValueNoiseFarbe, sFarbe, true)})
            

            https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#on---subscribe-on-changes-or-updates-of-some-state

            f84c0ee5-092c-4cde-9a91-1bd4a5ce3ce2-image.png

            Ro75 1 Reply Last reply Reply Quote 0
            • Ro75
              Ro75 @mickym last edited by

              @mickym Und nochmal. Es ist ein Beispiel. Ursprung ist kein Wert der getriggert wird, sondern (z.B.) aus einer Berechnung kommt.

              Ich wollte nur wissen ob es eine kürzere Möglichkeit gibt zu erkennen, ob der Wert tatsächlich geschrieben werden muss. getState, setState irgend ein anderes ...State.

              mickym 1 Reply Last reply Reply Quote 0
              • mickym
                mickym Most Active @Ro75 last edited by mickym

                @ro75 sagte in Wert nur schreiben, wenn sich dieser geändert hat:

                @mickym Und nochmal. Es ist ein Beispiel. Ursprung ist kein Wert der getriggert wird, sondern (z.B.) aus einer Berechnung kommt.

                Ich wollte nur wissen ob es eine kürzere Möglichkeit gibt zu erkennen, ob der Wert tatsächlich geschrieben werden muss. getState, setState irgend ein anderes ...State.

                OK - dann wenn Du eine Variable mit dem Wert eines DP vergleichst, dann weiß ich nichts anders. Dann entschuldige mein Missverstehen.

                Ro75 1 Reply Last reply Reply Quote 0
                • Ro75
                  Ro75 @mickym last edited by

                  @mickym Kein Problem. Hab das hier schon gesehen. 😕 Wenn man sich eben nicht gleich alles merkt.

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

                    @ro75 sagte: Gibt es eine elegantere / kürzere Lösung?

                    Man kann anstelle von getState(id).val auch eine Variable verwenden.

                        if (lastFarbe != sFarbe) {
                            setState(ValueNoiseFarbe, sFarbe, true);
                            lastFarbe = sFarbe;
                        }
                    

                    Wird die Variable lastFarbe nicht initialisiert, wird allerdings nach Skriptstart geschrieben.

                    Ro75 1 Reply Last reply Reply Quote 1
                    • Ro75
                      Ro75 @paul53 last edited by

                      @paul53 ja, diese Variante praktiziere ich schon an einigen Stellen. Damit erspare ich mir die Abfrage auf die "DB".

                      Gibt es keine "Change State"?

                      T 1 Reply Last reply Reply Quote 0
                      • T
                        ticaki Developer @Ro75 last edited by ticaki

                        @ro75
                        Nein hat mich jetzt aber interessiert folgender Code:

                        let a = getState('0_userdata.0.MQTT.shellyplus1pm-sadf.temperature:102.tC').val
                        
                        var us = require('microtime');
                        let x = 0
                        let b = 0
                        var start = us.now();
                        while (b++ < 1000) {
                            if (a > 0) {
                                x++
                            }
                        }
                        var stop =us.now()
                        b=0
                        var start2 = us.now()
                        while (b++ < 1000) {
                            if (getState('0_userdata.0.MQTT.shellyplus1pm-dfg.temperature:102.tC').val >0) {
                                x++
                            }
                        }
                        var stop2 = us.now()
                        
                        log('variable dauert: ' +(stop - start) + 'ms')
                        log('getState dauert: ' +(stop2 - start2) + 'ms')
                        

                        gibt dieses Ergebnis:

                        18:38:01.850	info	javascript.0 (4864) script.js.Test.Skript_122: variable dauert: 48µs
                        18:38:01.850	info	javascript.0 (4864) script.js.Test.Skript_122: getState dauert: 250µs
                        
                        paul53 1 Reply Last reply Reply Quote 1
                        • Ro75
                          Ro75 last edited by

                          @ticaki Danke. Also auf ein besonderes State brauche ich also nicht bauen. Keine Ahnung was ich da gelesen hab. Egal, aber deine Zeiten sind interessant. Für mich also ganz klar. Auf Variable statt getState umstellen - systemweit.

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

                            @ticaki sagte: gibt dieses Ergebnis:

                            Die Verwendung von Variablen ist immer effizienter als der Aufruf einer komplexen Funktion.

                            T 1 Reply Last reply Reply Quote 0
                            • T
                              ticaki Developer @paul53 last edited by ticaki

                              @paul53 sagte in [gelöst] Wert nur schreiben, wenn sich dieser geändert hat:

                              @ticaki sagte: gibt dieses Ergebnis:

                              Die Verwendung von Variablen ist immer effizienter als der Aufruf einer komplexen Funktion.

                              Das ist klar, aber 5 mal effizienter ist dann doch ne Ansage. 🙂 wobei es zwischen 2 mal schneller und 12 mal schneller schwankt. Bei 10000 Durchläufen ist es Faktor 7

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              934
                              Online

                              31.9k
                              Users

                              80.1k
                              Topics

                              1.3m
                              Posts

                              4
                              13
                              493
                              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