NEWS
Anfängerfrage: setState nur bei Änderung?
-
Hallo,
ist vielleicht eine blöde Frage, aber muss man im Adapter immer selbst prüfen, ob der Status eines Gerätesensors von dem aktuellen Status in IO Broker abweicht und darf nur dann den geänderten Status per setState melden? Ich hätte eigentlich gedacht, dass man jederzeit setState auch mit unverändertem Wert aufrufen kann und IO Broker meldet das nur dann an Subscriber weiter, wenn der Wert sich auch geändert hat. Wenn ich mich selbst per adapter.on('stateChange' anmelde, bekomme ich jeden einzelnen Aufruf, auch wenn sich der Wert nicht geändert hat.
Bedeutet das auch andersrum, dass man damit rechnen muss, dass man z.b. LampeAnschalten=true auch mehrmals nacheinander bekommen kann und man erstmal selbst prüfen muss, ob die Lampe nicht eh schon an ist? -
@HausBusDe
Ich merke mir im Adapter immer zuerst selbst den letzten Wert und führe setstate erst aus, wenn sich der Wert geändert hat. -
Aber das ist eigentlich recht unnötig bzw. ineffizient, weil die kompletten Daten dann nochmal gespiegelt im Adapter vorgehalten werden. Kennt jemand einen guten Grund wieso IO Broker das so handhabt? Es wäre doch ein leichtes, die Listener nur dann zu informieren, wenn ein gesetzter State auch anders ist, als der vorherige. Natürlich nur bei den setState mit ack und nicht bei Aufrufen, die Aktionen bewirken.
-
@HausBusDe sagte:
IO Broker meldet das nur dann an Subscriber weiter, wenn der Wert sich auch geändert hat.
ioBroker meldet auch eine Aktualisierung des Zeitstempels (change: "any"). Andernfalls könnte man nicht auf Datenpunkte mit konstantem Wert (z.B. Taster) triggern.
-
@paul53 danke, das ist ein guter Hinweis. Wie werden Taster denn abgebildet? Die melden quasi nicht zwei Events, dass sie gedrückt und dann losgelassen wurden, sondern nur einen value "ausgelöst", der sich nie ändert und nur nen neuen Timestamp bekommt?
-
@HausBusDe sagte:
Wie werden Taster denn abgebildet?
Ich kenne nur die HomeMatic-Taster (klassisch): Der Wert ist immer true. PRESS_SHORT aktualisiert den Zeitstempel, wenn die Taste innerhalb von 0,4 s nach Drücken losgelassen wird; PRESS_LONG aktualisiert den Zeitstempel, wenn nach 0,4 s die Taste noch gedrückt ist.
-
@paul53 danke! Ich glaube, dann mache ich das auch so. Wir haben klicked, double klicked und hold start und hold end