fyi: ROTENC Verhalten bei fhem restart

Begonnen von wkarl, 19 November 2014, 06:58:13

Vorheriges Thema - Nächstes Thema

wkarl

Hallo Norbert,

vor ein paar Tagen habe ich festgestellt, dass bei einem Restart von fhem FIRMATA inititialisiert wird und in der Folge der Wert von ROTENC auf '0' gesetzt wird. Ich sehe dies nicht als Fehler, sondern als 'works as designed'. Dennoch knabbere ich seitdem an einer Lösung, die dieses Verhalten berücksichtigt und den Stellgrad des Stellmischers (Fussbodenheizung) weiterhin als Wert von 0 bis 20 liefert.

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

wkarl

#1
Hallo,

Habe folgendes Konstrukt im Einsatz.
Das notify schreibt bei einem shutdown den korrigierten, letzten Wert vom FRM_RotEnc in einen Dummy.
define ShutdownFrmRotEnc notify global:SHUTDOWN { \
my $pos = ReadingsVal("FrmRotEnc_LastValue","state",0) + (ReadingsVal("StellMischer_FH","position",0)*(-1));;\
    fhem("set FrmRotEnc_LastValue $pos");;\
    }
attr ShutdownFrmRotEnc disable 0
define FrmRotEnv_LastValue dummy
attr FrmRotEnv_LastValue group Heizung
attr FrmRotEnv_LastValue icon control_plus@black
attr FrmRotEnv_LastValue room H-KG-Heizung


Im device wird STATE entsprechend ermittelt.
attr StellMischer_FH stateFormat { ReadingsVal("FrmRotEnc_LastValue","state",0) + (ReadingsVal($name,"position",0)*(-1)) }

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

ntruchsess

Hallo Walter,

danke dafür, dass Du Deinen Workaround veröffendlichst. Ich habe mir auch ein paar Gedanken dazu gemacht. Man muss da zwei Dinge unterscheiden:

1. die Firmata setzt den Wert auf Null, wenn der Arduino zurückgesetzt wird. Entweder per echtem Reset, oder über das Firmata-protokoll. Es läßt sich auch ein einzelner Encoder individuell zurücksetzen.
2. das FRM_ROTENC-device soll bei einem FHEM-Neustart seinen letzen Wert behalten bzw. Weiterverwenden.

Deinen Workaround werde ich in ähnlicher (etwas verbesserter) Form das Modul selbst einbauen. (Verbessert dahingehend, dass er bei jedem Reinitialisieren des Moduls, also auch nach einem Wiederverbinden des Arduinos ohne FHEM-neustart funktioniert). Damit wäre sichergestellt, dass nach Neustart oder beim Wiederverbinden des Arduinos auf den Wert des 'position'-readings immer der letzte bekannte Wert vor Reinititialisierung draufaddiert wird. Was man damit systematisch nicht abfangen kann, ist folgendes: Wenn zwischen der Erfassung des letzten gültigen Wertes und Abschluss der Initialisierung der Drehgeber bewegt wird, dann geht diese Differenz verlohren. Das gleiche gilt für jede Bewegung, bei der der Arduino selbst nicht läuft. Den ersten Fall (Arduino wird von FHEM getrennt, läuft aber weiter) könnte man durch einen Umbau bzw. Erweiterung der ConfigurableFirmata in den Griff kriegen. Diese müsste in der Lage sein beim Verbinden dem Client mitzuteilen, dass sie schon konfiguriert ist um nicht von diesem zurückgesetzt zu werden. Den zweiten Fall (Arduin läuft temporär gar nicht) kann man systematisch nicht allein mit Software lösen. Dafür muss man den Drehgeber aktiv in eine bekannte Position (z.B. Endstellung) bewegen können, oder einen Schalter (Lichtschranke etc...) im Verstellweg haben, der ein Rücksetzen des Stellwertzählers triggern kann.

- Norbert

while (!asleep()) {sheep++};

ntruchsess

#3
so, hab den Workaround leicht abgewandelt ins Modul eingebaut.

Es gibt jetzt ein neues Reading 'value', das immer den Rohwert vom Geber her enthält. Dann gibt es ein Internal 'offset', dass beim Hochfahren auf den letzten Wert des Readings 'position' gesetzt wird. Position ist immer die Summe aus 'value' und 'offset'. 'value' ist beim Hochfahren immer 0.

EDIT: Link zu Vorabversion entfernt.

- Norbert
while (!asleep()) {sheep++};

ntruchsess

#4
Die Änderungen sind jetzt im SVN eingecheckt und (in Kürze) per update installierbar.

@wkarl: wenn Du updatest, dann solltest Du Deinen Workaround wieder entfernen, sonst wird 2 mal der gleiche Offset draufaddiert.

Bitte um Feedback, falls es was anderes als erwartet tut...

Gruß,

Norbert
while (!asleep()) {sheep++};