NEWS
[Gelöst] [Frage] stateChange bei Fehler rückgängig machen
-
Hallo,
ich schreibe mit Hilfe des Adapter-Templates einen eigenen Adapter und stehe vor dem Problem, einen durch den User gesetzten Datenpunkt (ack = false) auf den vorherigen Wert zurücksetzen zu müssen.
Konkret bedeutet das bei mir:
<list type="decimal">3. Der Datenpunkt ist vom Typ level, d.h. Werte von 0-100%.-
Ich kann den aktuellen Wert nicht aus dem Gerät lesen (!!!)
-
Es sind nur bestimmte Werte definiert (abhängig vom Device), z.B. 0%, 20%, 40%, 60%, 80% und 100%, ist aber für jedes Device unterschiedlich.
D.h., wenn ich den Datenpunkt auf 20% setze, ist alles ok. Setze ich den Datenpunkt auf 25%, so ist das Ergebnis nicht definiert und ich möchte den Wert zurück auf den alten Wert setzen, z.B. wieder auf 20%.
Lese ich den Wert mit getState aus, bekomme ich allerdings schon den neuen Wert geliefert. Muss ich mir die alten Werte also selbst speichern oder gibt es eine einfachere Methode?
Viele Grüße
Michael
-
-
Wenn du das Objekt (mit getObject) und nicht den State abrufst solltest du auch 'oldState' bekommen, also den Status vor der letzen Änderung, und darauf kannst du zurücksetzen!
-
@Frank: Mit getObject bekomme ich nur die Definitionen, aber nicht den Wert, weder den aktuellen, noch den alten. Trotzdem danke.
-
Das von fsjoke vorgeschlagene vorgehen funktioniert mindestens bei der subscription State Change.
Ich denke aber auch das es außerhalb gehen sollte.
Wenn es nicht anders geht dann musst du es wohl selbst zwischen speichern.
Gesendet von Unterwegs
-
Old state gibt's nur bei "onStateChanged". Aber am Ende ist das doch der Punkt an dem auch die Logik für Änderungen liegt und man entscheidet ob ein Wert korrekt ist, oder?! Damit braucht man dort eigentlich kein getObject.
Ansonsten musst du die letzten Werte im Adapter speichern
-
Ich stehe - glaube ich - noch etwas auf dem Schlauch. Im````
on('stateChange', ...So sieht es bei mir aktuell aus:
adapter.on('stateChange', function (id, state) {
if (state && !state.ack) {
// Try setting the new value and revert to old value on errorMichael
-
Ich glaube ihr werft hier Adapter-Entwicklung und Skript-Entwicklung zusammen.
Im JS-Adapter gibts im on/subscribce-Callback obj.(new)state und obj.oldState, in denen das alte und neue State-Objekt stehen. In eigenen Adaptern wird bei StateChange nur der jeweils aktuelle State an den Callback übergeben:
type StateChangeHandler = (id: string, obj: State) => void;
Schätze hier führt kein Weg daran vorbei, selbst eine Liste der States zu führen, die mit ack=true vom Gerät bestätigt wurden.
-
Ok. Dann werde ich mir den alten Status selbst merken.
Danke an alle.
Michael