Hallo,
leider komme ich bei dem Versuch ein LED-Stripe über einen Funkwandtaster zu schalten, an meine Grenzen. Ich möchte bei kurzer Betätigung des Btn_1 mein LED-Stripe einschalten. Nach einer halben Stunde soll es dann von selbst auch wieder ausgehen. Ergänzend dazu, soll eine weitere kurze Tastenbetätigung mein LED-Stripe auch wieder ausschalten können. Das manuelle Ein- und Ausschalten funktioniert auch ohne Probleme:
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "off"
)
(set LEDStripeKueche on)
DOELSEIF
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "on"
)
(set LEDStripeKueche off)
aber wenn ich im Anweisungsteil vom DOIF noch ein sleep:
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "off"
)
(
set LEDStripeKueche on,
sleep 2700;
set LEDStripeKueche off
)
...
unterbringen möchte, kann ich mein LED-Stripe nach dem automatischen Ausschalten manuell nicht wieder einschalten. Ich habe es bereits mit eingen Attributen wie do always und repeatsame "herumexperimentiert", aber das Ergebnis bleibt immer dasselbe. Ein manueller Tastendruck lässt das LED-Stripe völlig kalt...:-(
Hat jemand vielleicht einen Tipp, was da schief laufen könnte?
Moin
Bitte benutze codetags, das # ueber den Smilies! Und dann hilft ein list des devices mehr als das zusammenkopierte!
So wie Du das beschreibst, kann man auch nicht nachvollziehen, wie das DOIF jetzt wirklich aussieht.
Grundsaetzlich aber denke ich, dass der Ansatz falsch ist, und Du ein onfortimer nutzen solltest, sofern das bei dem Aktor fuer den Stripe moeglich ist!
Gruss Christoph
Moin,
wenn der Schaltaktor kein on-for-time unterstützt dann versuch es mal mit
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "off"
)
(set LEDStripeKueche on) (set LEDStripeKueche off)
attr doifname wait 1800
ein zweites DOIF muss dann den Ausschaltpart übernehmen. commandref lesen hilft (oft) ;)
Gruß
Arthur
Hallo Arthur
Und Codetags helfen auch!
Gruss Christoph
bei 6 Zeilen halte ich das für übertrieben ;)
Code-Tags machen es auch bei nur 6 Zeilen einfacher zu überblicken...
Und wenn du schon auf die commandref verweist: hättest du das intensiver getan, solltest du wissen, dass die Empfehlung, ein 2. DOIF zu nutzen suboptimal ist. Sollte (ungetestet) so gehen:
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "off"
)
(set LEDStripeKueche on) (set LEDStripeKueche off)
DOELSEIF
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "on"
)
(set LEDStripeKueche off)
attr doifname wait 0,2700:0
Aber was ich mich bei der Lektüre des ersten Beitrags gefragt habe: warum nutzt der TE erst ein ",", und dann ein ";", um einzelne Teile des Ausführungsteils zu trennen :o .
DOIF trennt Befehle nach meiner Kenntnis nur durch ","...
@arthur_dent_2015
Danke für den Hinweis. Dann folgt hier auch schon das list in den Codetags (das LED-Stripe-Modul kennt leider kein on-for-timer):
Internals:
CFGFN /stripe/opt/fhem/etc/fhem/HMLAN.cfg
DEF (
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "off"
)
(
set LEDStripeKueche on,
sleep 2700;
set LEDStripeKueche off
)
DOELSEIF
(
[WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType] eq "short_Release" and
[LEDStripeKueche:state] eq "on"
)
(set LEDStripeKueche off)
NAME WG.EG.KUECHE.LED_BELEUCHTUNG
NR 966
NTFY_ORDER 50-WG.EG.KUECHE.LED_BELEUCHTUNG
STATE initialized
TYPE DOIF
Readings:
2017-09-27 12:52:26 cmd 0
2017-09-27 12:52:26 state initialized
Condition:
0 ReadingValDoIf($hash,'WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1','virtActTrigType') eq "short_Release" and ReadingValDoIf($hash,'LEDStripeKueche','state') eq "off"
1 ReadingValDoIf($hash,'WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1','virtActTrigType') eq "short_Release" and ReadingValDoIf($hash,'LEDStripeKueche','state') eq "on"
Devices:
0 WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1 LEDStripeKueche
1 WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1 LEDStripeKueche
all WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1 LEDStripeKueche
Do:
0:
0 set LEDStripeKueche on, sleep 2700; set LEDStripeKueche off
1:
0 set LEDStripeKueche off
2:
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Itimer:
Readings:
0 WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType LEDStripeKueche:state
1 WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType LEDStripeKueche:state
all WG.EG.hmVIRTUAL_ACTOR.KUECHE.1_Btn1:virtActTrigType LEDStripeKueche:state
Regexp:
All:
State:
Attributes:
checkReadingEvent 1
cmdState an|aus
room WIR.KUECHE
@pc1246
Danke für deinen Vorschlag! So etwas ähnliches hatte ich auch schon im Kopf, nur hatte ich die Befürchtung, dass sich die beiden DOIFs gegenseitig beeinflussen könnten, da der state am Ende ja immer auf "short_Release" steht. Wird dann das LED-Stripe automatisch ausgeschaltet, so vor mir vermutet, müsste dann nicht das andere DOIF "feuern"?
Und glaube mir bitte, die Doku habe ich bereits gelesen, nur leider keinen Erfolg damit gehabt. :)
Zitat von: arthur_dent_2015 am 27 September 2017, 12:42:03
bei 6 Zeilen halte ich das für übertrieben ;)
Schaus Dir mal an, koennten auch 7 sein!?
Und das ist genau der Grund!
Gruss Christoph
@Beta-User
Super, das sieht wirklich schlüssig für mich aus. Ich werde das mal heute abend zu Hause ausprobieren. :)
Ohne das ";" blockiert FHEM da hinter sleep noch ein Befehl erwartet wird:
https://forum.fhem.de/index.php/topic,58123.msg495537.html#msg495537 (https://forum.fhem.de/index.php/topic,58123.msg495537.html#msg495537)
okay, okay. Grundsätzlich nutze ich ja Codetags.
@Beta-user: blockiert der Timer vom DOIF nicht den DOELSEIF?
Gruß
Arthur
@Arthur:
Du fragst den Falschen, ich bin kein DOIF-User und würde sowieso versuchen, sowas mit perl zu lösen.
Aber da Damian diese Funktion bereitgestellt hat, bin ich mir ziemlich sicher, dass das grundsätzlich funktioniert, man aber ggf. noch irgendwelche mir völlig unverständlichen weiteren Attribute setzen muß. Und wie immer: Versuch macht kluch...
Ich hatte das so verstanden, dass ein anderer Zweig (":") auch unmittelbar ausgeführt wird, wenn für diesen "0" als Verzögerung angegeben wird. Das m´üßte das also paßen wie von mir angegeben. Kann aber auch sein, dass es ein "resetwait" oder auch was anderes braucht...
@Beta-User
Habe deinen Vorschlag gestern Abend noch eingebaut und getestet. Es funktioniert jetzt wie gewünscht, auch wenn ich manchmal vom Homematic-Taster eine rote Rückmeldung bekomme (die hatte ich vorher nicht). Also vielen Dank nochmals!
Da man ja nie dumm sterben sollte, würde mich dann aber doch interessieren, warum mein erster Ansatz nicht geklappt hat. Vielleicht findet sich ja einer der es mir noch erklären könnte...