Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst] Wert nur schreiben, wenn sich dieser geändert hat

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.0k

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

Scheduled Pinned Locked Moved JavaScript
13 Posts 4 Posters 686 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Ro75R Online
    Ro75R Online
    Ro75
    wrote on last edited by Ro75
    #1

    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.

    SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

    mickymM paul53P 2 Replies Last reply
    0
    • Ro75R 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.

      mickymM Online
      mickymM Online
      mickym
      Most Active
      wrote on last edited by mickym
      #2

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

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Reply Last reply
      0
      • Ro75R Online
        Ro75R Online
        Ro75
        wrote on last edited by
        #3

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

        SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

        mickymM 1 Reply Last reply
        0
        • Ro75R Ro75

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

          mickymM Online
          mickymM Online
          mickym
          Most Active
          wrote on last edited by mickym
          #4

          @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

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          Ro75R 1 Reply Last reply
          0
          • mickymM 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

            Ro75R Online
            Ro75R Online
            Ro75
            wrote on last edited by
            #5

            @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.

            SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

            mickymM 1 Reply Last reply
            0
            • Ro75R Ro75

              @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.

              mickymM Online
              mickymM Online
              mickym
              Most Active
              wrote on last edited by mickym
              #6

              @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.

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              Ro75R 1 Reply Last reply
              0
              • mickymM 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.

                Ro75R Online
                Ro75R Online
                Ro75
                wrote on last edited by
                #7

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

                SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                1 Reply Last reply
                0
                • Ro75R 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.

                  paul53P Offline
                  paul53P Offline
                  paul53
                  wrote on last edited by paul53
                  #8

                  @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.

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  Ro75R 1 Reply Last reply
                  1
                  • paul53P 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.

                    Ro75R Online
                    Ro75R Online
                    Ro75
                    wrote on last edited by
                    #9

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

                    Gibt es keine "Change State"?

                    SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                    T 1 Reply Last reply
                    0
                    • Ro75R Ro75

                      @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 Do not disturb
                      T Do not disturb
                      ticaki
                      wrote on last edited by ticaki
                      #10

                      @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
                      

                      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                      Spenden

                      paul53P 1 Reply Last reply
                      1
                      • Ro75R Online
                        Ro75R Online
                        Ro75
                        wrote on last edited by
                        #11

                        @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.

                        SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                        1 Reply Last reply
                        0
                        • T 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
                          
                          paul53P Offline
                          paul53P Offline
                          paul53
                          wrote on last edited by paul53
                          #12

                          @ticaki sagte: gibt dieses Ergebnis:

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

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          T 1 Reply Last reply
                          0
                          • paul53P paul53

                            @ticaki sagte: gibt dieses Ergebnis:

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

                            T Do not disturb
                            T Do not disturb
                            ticaki
                            wrote on last edited by ticaki
                            #13

                            @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

                            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                            Spenden

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            636

                            Online

                            32.4k

                            Users

                            81.4k

                            Topics

                            1.3m

                            Posts
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            ioBroker Community 2014-2025
                            logo
                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Recent
                            • Tags
                            • Unread 0
                            • Categories
                            • Unreplied
                            • Popular
                            • GitHub
                            • Docu
                            • Hilfe