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

                      725

                      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