readingsProxy: valueFn wird initial nicht berücksichtigt?

Begonnen von mc, 27 April 2015, 02:13:44

Vorheriges Thema - Nächstes Thema

mc

Hallo zusammen,

leider habe ich bei meiner Suche hier im Forum, in der Commandref, Google, etc. keine Idee gefunden, wie ich am besten mit folgender Problematik umgehen kann:

Ich habe an einen MCP 23017 ein Relaisboard angeschlossen und mir überlegt, die einzelnen Relais mit readingProxys zu steuern:

define relais0 readingsProxy i2c20:PortB0
attr relais0 room ops
attr relais0 devStateIcon on:on:off off:off:on
attr relais0 alias Relais 0 (In1)
attr relais0 setList on off
attr relais0 setFn {($CMD eq "on")?"PortB0 off":"PortB0 on"}
attr relais0 valueFn {($VALUE eq "on")?"off":"on"}


Da der Port-Status vom MCP 23017 im Vergleich zum Status der Relais invertiert ist, habe ich valueFn entsprechend gesetzt. Beim ersten Anlegen zeigt der readingsProxy aber leider immer genau den gegenteiligen Wert an. Wenn ich (je nach aktuellem Zustand) set relais0 on bzw. set relais0 off ausführe, passt alles. Mit eventMap habe ich auch schon herumprobiert, war aber leider erfolglos.

Kann man irgendwie erreichen, dass sich der readingsProxy einmal aktualisiert und valueFn berücksichtigt?

mc

Heute ist mir beim Experimentieren etwas interessantes aufgefallen, was für mich eine weitere Frage nach dem Verhalten von fhem aufwirft. Im Gegensatz zu dem Kommando wie oben beschrieben sorgt folgendes (eingegeben an der telnet-Schnittstelle) dafür, dass scheinbar die valueFn berücksichtigt wird. Damit wäre mein Problem eigentlich gelöst, mir erschließt sich die Logik dahinter aber leider nicht.

{ foreach my $i (0..8) { \
  my $j=$i+1;; \
  fhem(" \
    define relais$i readingsProxy i2c20:PortB$i;; \
    attr relais$i room ops;; \
    attr relais$i devStateIcon on:on:off off:off:on;; \
    attr relais$i alias Relais $i (In$j);; \
    attr relais$i setList on off;; \
    attr relais$i setFn {(\$CMD eq 'on')?'PortB$i off':'PortB$i on'};; \
    attr relais$i valueFn {(\$VALUE eq 'on')?'off':'on'};; \
");; } }
delete relais8


Mir ist aufgefallen, dass immer der letzte readingProxy, der mit dieser Schleife angelegt wird, den "falschen" state hat (valueFn scheinbar nicht berücksichtigt). Daher lege ich hier einen zu viel an und lösche ihn anschließend gleich wieder.

mc

Ich glaube, ich habe eine gute Lösung gefunden indem ich setdefaultattr verwende.

Folgendes funktioniert für mich:
setdefaultattr valueFn {($VALUE eq "on")?"off":"on"}
define relais0 readingsProxy i2c20:PortB0
attr relais0 room ops
attr relais0 devStateIcon on:on:off off:off:on
attr relais0 alias Relais 0 (In1)
attr relais0 setList on off
attr relais0 setFn {($CMD eq "on")?"PortB0 off":"PortB0 on"}
setdefaultattr # delete defaultattr


Vermutlich ist die Ursache für das seltsame Verhalten eine Art Timing-Problem. Scheinbar wird, wenn man die valueFn schnell genug (also vor dem ersten Setzen von state) setzt, diese auch berücksichtigt.