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

      @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

                          682
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

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