Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker 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.1k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
13 Beiträge 4 Kommentatoren 686 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Ro75R Online
    Ro75R Online
    Ro75
    schrieb am zuletzt editiert von 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 Antworten Letzte Antwort
    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
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      0
      • Ro75R Online
        Ro75R Online
        Ro75
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                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
                  schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                  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
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    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 Nicht stören
                      T Nicht stören
                      ticaki
                      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                      1
                      • Ro75R Online
                        Ro75R Online
                        Ro75
                        schrieb am zuletzt editiert von
                        #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 Antwort Letzte Antwort
                        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
                          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                          0
                          • paul53P paul53

                            @ticaki sagte: gibt dieses Ergebnis:

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

                            T Nicht stören
                            T Nicht stören
                            ticaki
                            schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                            0
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            548

                            Online

                            32.4k

                            Benutzer

                            81.4k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            ioBroker Community 2014-2025
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe