NEWS
setState nur wenn Wert noch nicht gesetzt ist?
-
@schmakus sagte in setState nur wenn Wert noch nicht gesetzt ist?:
Hi,
gibt es einen Befehl fürsetState
, welchen den Wert nur dann setzt, wenn er nicht schon vorhanden ist?
Aktuell mache ich es übergetState
und vergleiche den Wert mit dem zu setzenden Wert.let oldval = getState(path).val; if(oldval != value){
Grüße
Schmakuswillst du setstate nur schreiben, wenn noch nie etwas geschrieben wurde?
dann machst du die Abfrage bei der Objekterstellung und schreibst einen initialwert.wenn du nochmal den gleichen wert drüberschreibst ist das ja nicht so schlimm.
wenn du den datenpunkt mit dem history-adapter aufzeichnest und dort keine gleichen werte haben möchtest, dann kann man da eine Option anklicken "nur Änderungen aufzeichnen" -
@schmakus sagte: gibt es einen Befehl für setState, welchen den Wert nur dann setzt, wenn er nicht schon vorhanden ist?
Du meinst, wenn der neue Wert ungleich dem vorhanden Wert ist?
Das muss man mit getState(id).val zum Vergleich machen, es sei denn, man hat den Wert aus einem Trigger auf den zu schreibenden Datenpunkt in einer Variablen. -
@schmakus Es gibt eigentlich keinen Grund, nur "veränderte" Werte zu schreiben. Alles in ioBroker ist so ausgelegt, dass es mit gleichen Werten umgehen kann. In Skripten kann man auch auf "change" triggern. Und History kann auch filtern. Zudem ist das ja der aktuelle Wert und den mit dem Zeitstempel zu schreiben entspricht der "echten Welt".
-
@unclesam sagte: Es gibt eigentlich keinen Grund, nur "veränderte" Werte zu schreiben.
Doch, wenn der Wert gesendet wird: Duty cycle, Störpegel.
-
Mir geht es hauptsächlich wie @paul53 geschrieben hat, um die Auslastung diverser Protokolle.
In meinem Fall geht es um Zigbee. Wenn ich z.B. 8 Lampen gleichzeitig ansteuere (über eine Gruppe), dann macht es ja wenig sinn, 8x die TransitionTime, 8x die Farbtemperatur, 8x.... zu senden.Oder fängt dies z.b. der Zigbee Adapter ab?
Bei Homematic z.B. wird dadurch nur unnötiger DutyCicle erzeugt.
-
@schmakus hä.. wie jetzt.. verstehe nicht ?? was wird per zigbee behandelt?
-
@schmakus die Frage interessiert mich auch. Hab es auch mit if (!getState().Val) gelöst.
Bei mir ist der Hauptgrund dieser Abfrage das die BWM Melder immer bei Bewegung die hue Lampen neu auf True gesetzt haben obwohl diese schon an waren. Diese unnötige Senderei wollte ich mir auch sparen. -
@ciddi89 sagte in setState nur wenn Wert noch nicht gesetzt ist?:
@schmakus die Frage interessiert mich auch. Hab es auch mit if (!getState().Val) gelöst.
Bei mir ist der Hauptgrund dieser Abfrage das die BWM Melder immer bei Bewegung die hue Lampen neu auf True gesetzt haben obwohl diese schon an waren. Diese unnötige Senderei wollte ich mir auch sparen.Wie es bei zigbee genau ist, weiß ich nicht.
Es kommt auch auf die Situation an, wer an den zigbee geräten noch mit steuert.
in meinen adaptern führe ich im speicher meist ein abbild der states mit um da nochmal gegen zu checken und mehrfach beschreiben des gleichen wertes zu verhindern.sobald aber der iobroker adapter nicht der einzige controller ist, der steuert musst du entweder immer neu schreiben oder vorher den status immer nochmal checken.
bei einem schalter kann ich mir folgendes vorstellen
über einen adapter schaltet man den an, jemand anders schaltet den schalter an der wand wieder aus. dann bekommst du den status nur mit wenn du vorher den status abfragst oder wenn der schalter von sich aus informiert, das er sich geändert hat (was meist nicht so passiert).du kannst das ja mal testen, in dem du einen datenpunkt mehrfach mit dem gleichen wert beschreibst und vorher die history aktivierst und "nur Änderung aufzeichnen" ausschaltest.
Wenn dann der Wert mehrfach in der Tabelle auftaucht, dann schreibt der Adapter hier auch mehrfach. -
@oliverio danke for die ausführliche Antwort. Ich mein, wenn es nichts macht dann ist auch gut. Hab nur in letzter Zeit im log gesehen das zb. Wenn ein BWM auslöst, mein Script bei jeder Bewegung den Wert für setState() neu gesetzt hat obwohl das Objekt diesen Wert schon hatte. Daher passte die Frage von @Schmakus perfekt. Möchte halt das meine Skripte so Ressourcen schonend arbeiten wie es geht und vielleicht hätte man da ja was optimieren können. Aber wenn es egal ist ob er die Werte nochmal setzt oder nicht, dann kann ich ja die getState() Abfrage vorab, die ich deswegen mit eingefügt habe, auch weg lassen.
LG
-
@ciddi89 sagte in setState nur wenn Wert noch nicht gesetzt ist?:
@oliverio danke for die ausführliche Antwort. Ich mein, wenn es nichts macht dann ist auch gut. Hab nur in letzter Zeit im log gesehen das zb. Wenn ein BWM auslöst, mein Script bei jeder Bewegung den Wert für setState() neu gesetzt hat obwohl das Objekt diesen Wert schon hatte. Daher passte die Frage von @Schmakus perfekt. Möchte halt das meine Skripte so Ressourcen schonend arbeiten wie es geht und vielleicht hätte man da ja was optimieren können. Aber wenn es egal ist ob er die Werte nochmal setzt oder nicht, dann kann ich ja die getState() Abfrage vorab, die ich deswegen mit eingefügt habe, auch weg lassen.
LG
da die autoren hier nicht reagiert haben,
kannst du ja mal bei github einen issue einstellen
und die frage nochmal dort stellen
https://github.com/ioBroker/ioBroker.zigbee/issues
ich habe gesehen, das da ganz fleißig dran gearbeitet wird und fast täglich Änderungen in den adapter eingearbeitet werden. -
@oliverio said in setState nur wenn Wert noch nicht gesetzt ist?:
da die autoren hier nicht reagiert haben,
kannst du ja mal bei github einen issue einstellen
und die frage nochmal dort stellen
https://github.com/ioBroker/ioBroker.zigbee/issues
ich habe gesehen, das da ganz fleißig dran gearbeitet wird und fast täglich Änderungen in den adapter eingearbeitet werden.Ja, nur das ich kein Zigbee verwende sondern Hue und HM. Aber werde es nochmal beobachten. Und wenn es nicht nötig ist, nehme ich die vorherige Abfrage, ob schon true oder false gesetzt ist, einfach raus.
Lg