Verhalten von userReading beim Starten

Begonnen von eki, 26 Juni 2015, 13:40:45

Vorheriges Thema - Nächstes Thema

eki

Hallo zusammen,

ich versuche gerade meine Rademacher Rolladenwickler fhem fähig zu machen. Dazu verwende ich eine Handfernsteuerung, die ich über einen HM-Mod-Re-8 schalte. Was passieren muss, ist, dass eine Sequenz mehrerer kurzer Aktivierungen verschiedener Kanäle des HM-Mod-Re-8 geschaltet werden muss.

Ich habe das über dummies mit verschiedenen userReadings (für Hochlaufzeit, Auswahl des Schalters für den richtigen Rolladen etc.) und über eine DOIF "Abfolge" mit entsprechend eingestellten wait Settings realisiert.

Das funktioniert auch soweit gut, allerdings sind nach einem Neustart die userReadings nicht alle so, wie ich sie erwarten würde.

Ich habe folgendes userReadings Attribut:

driveUp {return 37;;}, driveDown {return 38;;}, diffState difference {ReadingsVal("eg_WZ_Rolladen_Ost","state",0);;}, oldState {ReadingsVal("eg_WZ_Rolladen_Ost","state",0)-ReadingsVal("eg_WZ_Rolladen_Ost","diffState",0);;}, rlNr {;;}, nrSet {;;}

Es wird also ermittelt, was die Differenz zwischen dem letzten und aktuellen Stand des State ist (State enthält den aktuellen Rolladenstand von 0 - 100). Diese Info wird dann zum Einstellen des wait Parameters beim DOIF verwendet z.B. für das Herunterfahren:

([eg_WZ_Rolladen_Ost:diffState] < "0") ({fhem "attr eg_WZ_Rolladen_Ost_steering_down wait "."0:1:1:".abs(((ReadingsVal("eg_WZ_Rolladen_Ost","diffState",0)*ReadingsVal("eg_WZ_Rolladen_Ost","driveDown",0)/100)+0)).":1";;},{fhem "set ".ReadingsVal("eg_WZ_Rolladen_Ost","rlNr","")." on"},{fhem "setreading eg_WZ_Rolladen_Ost nrSet 1"}) DOELSEIF ([eg_WZ_Rolladen_Ost_steering_down] eq "cmd_1") ({fhem "set ".ReadingsVal("eg_WZ_Rolladen_Ost","rlNr","")." off"},{fhem "setreading eg_WZ_Rolladen_Ost nrSet 0"},set rl_down on) DOELSEIF ([eg_WZ_Rolladen_Ost_steering_down] eq "cmd_2") (set rl_down off) DOELSEIF ([eg_WZ_Rolladen_Ost_steering_down] eq "cmd_3") (set rl_stop on) DOELSEIF ([eg_WZ_Rolladen_Ost_steering_down] eq "cmd_4") (set rl_stop off)

Nach dem Starten steht zwar der state auf dem alten Wert vor dem shutdown, allerdings ist diffState und der Wert für oldState immer 0. Was ich erwarten würde ist entweder oldState auf 0 und dann diffState auf dem Differenzwert, oder diffState auf 0 und oldState dann entsprechend auf dem state Wert.

Ich habe schon versucht, das über setreading statements in der fhem.cfg anzupassen, das funktioniert aber auch nicht. Hat jemand eine Idee, wie man das lösen könnte, oder muss ich statt dummies wirklich ein eigenes Device programmieren (die "richtigen" Readings werden beim shutdown ja gespeichert, und dann beim Starten wieder auf den richtigen Wert gesetzt).

rudolfkoenig

Die Readings werden beim shutdown im fhem.state gespeichert, da stehen sie mit setreading drin, fham.save wird auch nur via include reingelesen, nachdem fhem.cfg fertig ist.
userReadings werden beim Geraet-betreffenden events ausgefuehrt, und rechnen Ihre Werte neu. Eigentlich wird beim Hochfahren kein Geraete-Spezifisches event generiert.

Ich wuerde:
- zunaechst die Werte in fhem.state pruefen
- danach FHEM mit "attr global verbose 5" starten, und pruefen, wer/wann dummy betreffene Events generiert.

eki

Ich habe mir das Ganze jetzt mal angeschaut. Ich verwende userReadings mit dem modifier "difference". Nach dem Neustart wird das über "difference" abgeleitete userReading erst bei der zweiten Änderung geändert (zu sehen am Datum der Readings).
Ist das so Absicht? Einen "alten" state hätte man ja aus fhem.save eingelesen.