NEWS
[gelöst] Wert nur schreiben, wenn sich dieser geändert hat
[gelöst] Wert nur schreiben, wenn sich dieser geändert hat
-
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.
-
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 das ist mir bekannt und mache ich auch so. Mir ging es um diesen Code-Schnipsel und die Frage ob es eleganter geht.
@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)})
-
@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)})
@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 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.
@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 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.
-
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.
@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
lastFarbenicht initialisiert, wird allerdings nach Skriptstart geschrieben. -
@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
lastFarbenicht initialisiert, wird allerdings nach Skriptstart geschrieben. -
@paul53 ja, diese Variante praktiziere ich schon an einigen Stellen. Damit erspare ich mir die Abfrage auf die "DB".
Gibt es keine "Change State"?
@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 -
@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 -
@ticaki sagte: gibt dieses Ergebnis:
Die Verwendung von Variablen ist immer effizienter als der Aufruf einer komplexen Funktion.
@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
Wenn man sich eben nicht gleich alles merkt.