Nutzung des FS20 Hardwaretimers in fhem

Begonnen von marty29ak, 13 Januar 2016, 11:25:22

Vorheriges Thema - Nächstes Thema

marty29ak

Hallo,
ich nutze bei einigen FS20 SU Schalter den Hardwaretimer, da ich die wichtigen Aktoren im Haus direkt mit Sendern gekoppelt habe. (Bin öfter länger außer Haus und muss wegen dem Hausfrieden sicherstellen das auch beim Ausfall von Fhem alles weiter laufen kann)
Jetzt ist es ja so das dann Fhem nicht mitbekommt wenn die Zeit abgelaufen ist und somit für Fhem der Aktor immer noch auf on steht obwohl er wieder automatisch aus geschaltet hat.
Dazu habe ich diesen Beitrag gefunden: http://forum.fhem.de/index.php/topic,9534.msg52790.html#msg52790

Also mal eingerichtet und....funktioniert einwandfrei wie gewünscht.
Allerdings nur im Featurelevel 5.6 von Fhem. Das liegt wohl an den Variablen, welche Version 5.7 nicht mehr unterstützt werden.

Meine versuche das anzupassen scheitern leider an meinem Unwissen und enden immer in der "nicht Funktion"....
Daher könnte mal Jemand mit Ahnung drüber schauen wie das Define geändert werden muss damit es auch unter Fhem 5.7 läuft?

Eine neuere Version habe ich über die Suche nicht gefunden...

define hwTimerNotify notify .*:on$|:off$|:timer.* { my $OutString = "(Device: %NAME Action: %EVENT)";; if ("%TYPE" eq "FS20") { my $hwt = AttrVal("%NAME", "hw_timer", "0");; my $val = "0";; if ("%EVTPART0" ne "timer") { CommandDelete(undef, "%NAME_timer");; if (("%EVENT" eq "on") and ($hwt > 0)) { LOOP: for(my $i = 0;; $i <= 12;; $i++) { for(my $j = 0;; $j <= 15;; $j++) { $val = (2**$i)*$j*0.25;; if($val >= $hwt) { if($val != $hwt) { $OutString .= sprintf " (changing timeout to $val from $hwt)";; } last LOOP;; } } } my $to = sprintf("%02d:%02d:%02d", $val/3600, ($val%3600)/60, $val%60);; CommandDefine(undef, "%NAME_timer at +$to setstate %NAME off;; trigger %NAME off");; } } else { $OutString .= sprintf " (HW-Timer wird gesetzt auf: %EVTPART1)";; {fhem ("attr %NAME hw_timer %EVTPART1")} } } else { $OutString .= sprintf " (no FS20 Device)";; } sprintf "$OutString";; }
Gruß Martin

rudolfkoenig

Im wesentlichen muss man %NAME/%TYPE/%EV* durch $NAME/$TYPE/$EV* ersetzen. Ausnahmen sind sowas wie %NAME_timer. Die alte Methode war eine Textuelle ersetzung von %NAME, die Neue setzt die perl Variable $NAME, deswegen muss dieser Ausdruck als ${NAME}_timer uebersetzt werden.

Hier eine in Zeilen gebrochene und ungetestete Ersetzung. An der Struktur/Semantik habe ich nichts geaendert, auch wenn das noch optimiert werden koennte.

define hwTimerNotify notify .*:(on|off|timer.*)$ {\
my $OutString = "(Device: $NAME Action: $EVENT)";;\
if ("$TYPE" eq "FS20") { \
   my $hwt = AttrVal("$NAME", "hw_timer", "0");;\
   my $val = "0";;\
   if ("$EVTPART0" ne "timer") {\
     CommandDelete(undef, "${NAME}_timer");;\
     if (("$EVENT" eq "on") and ($hwt > 0)) {\
       LOOP: for(my $i = 0;; $i <= 12;; $i++) { \
         for(my $j = 0;; $j <= 15;; $j++) {\
           $val = (2**$i)*$j*0.25;;\
           if($val >= $hwt) {\
             if($val != $hwt) {\
               $OutString .= sprintf " (changing timeout to $val from $hwt)";;\
             }\
             last LOOP;;\
           }\
         }\
       }\
       my $to = sprintf("%02d:%02d:%02d", $val/3600, ($val%3600)/60, $val%60);;\
       CommandDefine(undef, "${NAME}_timer at +$to setstate $NAME off;; trigger $NAME off");;\
     }\
   } else {\
     $OutString .= sprintf " (HW-Timer wird gesetzt auf: $EVTPART1)";;\
     {\
       fhem ("attr $NAME hw_timer $EVTPART1")\
     }\
   }\
} else {\
   $OutString .= sprintf " (no FS20 Device)";;\
}\
"$OutString";;\
}


marty29ak

Danke für deine Hilfe, aber leider funktioniert es so nicht.
Es wird zwar kein Fehler angezeigt aber die Schalter werden auch nicht zurückgesetzt.
Habe noch versucht in der Zeile die % durch $ zu ersetzen, aber auch ohne Erfolg...

my $to = sprintf("$02d:$02d:$02d", $val/3600, ($val$3600)/60, $val$60);;
Gruß Martin

marty29ak

Sonst Niemand eine Idee?
Bin doch sicher nicht der einzige der die FS20 Hardwaretimer nutzt.
Gruß Martin

rudolfkoenig

Es gibt ein Attribut "follow-on-timer" fuer genau diesen Zweck.

marty29ak

#5
Leider funktioniert (zumindestens bei mir) das Attribut "follow-on-timer" nur wenn ich den Schalter über das Webfont betätige. Beim Schalten mit einer Fernbedienung hat das Attribut "follow-on-timer" keine Funktion.

Zur Sicherheit hier mal meine Einstellung:

Der Schalter:
define FS20_277243 FS20 2772 43
attr FS20_277243 IODev CUn3
attr FS20_277243 alias S_oben Flur
attr FS20_277243 comment Untoggle
attr FS20_277243 follow-on-timer 10
attr FS20_277243 fp_Terminal_test 466,260,0,FS20_277243,
attr FS20_277243 model fs20s4u
attr FS20_277243 room 7_Flur,B_FS20


Das Notify:
define N_Flur_oben notify FS20_277243 set FS20_277241 $EVENT

Der Aktor (zuvor wurde mit "set Timer 10" der Hardwaretimer gesetzt):
define FS20_277241 FS20 2772 41
attr FS20_277241 IODev CUL_0
attr FS20_277241 alias Oben FLur
attr FS20_277241 comment Untoggle
attr FS20_277241 follow-on-timer 10
attr FS20_277241 fp_Obergeschoss 335,533,0, ,FS20_277241
attr FS20_277241 model fs20su
attr FS20_277241 room 7_Flur,B_FS20
Gruß Martin

rudolfkoenig

Bei mir funktioniert es.
Wenn ich in einem leeren test Config zwei fake-CULs anlege mit
define CUL_0 CUL none 0000
define CUn3  CUL none 0000

und die gezeigten Definitionen samt Attribut ohne Aenderung hinzufuege, dann bekomme ich bei einem simulierten Schalt-Event die gewuenschten Ausschalt-Befehle:
Zitatfhem> { Dispatch($defs{CUn3}, "810b04xx0101a0012772430011", undef) }
ARRAY(0x7f864d09b308)
fhem> 2016-01-19 21:45:17 Global global DEFINED FS20_277243_timer
2016-01-19 21:45:17 at FS20_277241_timer Next: 21:45:27
2016-01-19 21:45:17 Global global DEFINED FS20_277241_timer
2016-01-19 21:45:17 FS20 FS20_277241 on
2016-01-19 21:45:17 FS20 FS20_277243 on
2016-01-19 21:45:27 Global global DELETED FS20_277241_timer
2016-01-19 21:45:27 FS20 FS20_277241 off
2016-01-19 21:45:27 FS20 FS20_277243 off
2016-01-19 21:45:27 Global global DELETED FS20_277243_timer

follow-on-timer im Aktor ist ueberfluessig, verursacht aber soweit ich sehe auch keine Probleme.

marty29ak

Hallo erst mal vielen Dank das du mir hilfst !!

Also wenn ich den Schalter S_oben Flur auf dem Floorplan anklicke sieht es gut aus und funktioniert wie gewollt:


2016-01-20 13:05:18 at FS20_277243_timer Next: 13:05:28
2016-01-20 13:05:18 Global global DEFINED FS20_277243_timer
2016-01-20 13:05:18 FS20 FS20_277241 on
2016-01-20 13:05:18 FS20 FS20_277243 on
2016-01-20 13:05:28 FS20 FS20_277241 off
2016-01-20 13:05:28 FS20 FS20_277243 off
2016-01-20 13:05:28 Global global DELETED FS20_277243_timer


Nutze ich aber den Wandtaster, wird zwar auch richtig geschaltet aber auf dem Floorplan bleibt der Schalter nach den 10 Sekunden auf ein stehen.
Im Log wird auch nur Toggle angezeigt:

2016-01-20 13:05:52 FS20 FS20_277241 toggle
2016-01-20 13:05:52 FS20 FS20_277243 toggle


Den Comment "Untoggle" habe ich ja gesetzt und dieser wird auch in der Weboberfläche so angezeigt.
Gruß Martin

rudolfkoenig

Funktioniert das Aktualisiern FHEMWEB?
Ich vermute ja, da fuer FLOORPLAN gerade aehnliche Probleme gemeldet wurden.

marty29ak

#9
Nein aktualisieren bringt nichts.
Wenn ich nicht über die Weboberfläche sondern am fs20 Sender direkt schalte wird wie schon oben gezeigt nur das Toggle Komando im Eventmonitor angezeigt.

Schaue ich mir dann den Status zu dem Schalter im Fhem Web  an.

Steht unter State "on" und unter Readings State " toggle"
Und es wird auch kein "AT" für den Timer angelegt.

(https://dl.dropboxusercontent.com/u/92909784/mit%20schalter.JPG)

Hier zum Vergleich wenn ich direkt im Fhem Web oder Floorplan schalte:

(https://dl.dropboxusercontent.com/u/92909784/mit%20Web.JPG)
Gruß Martin

rudolfkoenig

Fuer toggle ist "follow-on-timer" nicht ausgelegt, da es beim Verlust eines Paketes komplett durcheinanderkommt.
Er reagiert nur auf "on". "

marty29ak

Ich dachte dafür wäre das Untoggle da.
Ist natürlich blöd wenn man keine Wandtaster nutzen kann, das sind ja allgemein die üblichen Sender im Raum.
Extra einen zweiten oder doppel Taster neben die Türen um "on" und "off" generieren zu können ist auch nicht wirklich praktisch.
Mhh... damit wäre ich wieder bei dem im ersten Post angefragten Notify welches ja leider nicht unter Fhem 5.7 läuft.

Naja werde jetzt halt auf Fhem 5.6 wechseln, danke dir trotzdem für deine Mühe.

Wundere mich nur das keine weiteren Reaktionen von anderen User zu dem Thema kommen, scheinbar nutzt Niemand den Timer im normalen Alltag zur Zimmerbeleuchtung.
Gruß Martin