Hallo in die Runde!
Ich grabe mich seit einiger Zeit ins DOIF ... habe aber augenscheinlich noch zu vieles nicht verstanden :-\
Anwendung:
Wenn ich an einem FS20-Wandschalter die Taste 3 lange drücke ("dimupdown") sollen die Musiccast-Lautsprecher (mc_kueche) auf Quelle netradio mit Sender NDR-Info geschaltet werden.
Den Sender muss ich über das Ändern des Attributs vorgeben.
Erschwerend kommt hinzu, dass das Sender-Vorwählen nur zuverlässig funktioniert, wenn die Lautsprecher vorher aus waren. Ist irgendwie ein Problem im Modul ...
Aaaalso:
- Wenn dimupdown und Lautsprecher an => Ausschalten, Warten, Attribut setzen, MitSenderEinschalten
- Wenn dimupdown und Lautsprecher aus => Attribut setzen, MitSenderEinschalten.
Das sieht bei mir so aus:
[mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "on")
(set MC_Kueche power standby,{Log3 "MC_Kueche",3,"Kurz warten nach Ausschalten"})
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Umschalten auf NDR Info"},set mc_kueche_taste_3 dimup)
DOELSEIF([mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "off")
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR Info"},set mc_kueche_taste_3 dimup)
Zusätzlich
attr wait 0,1 gesetzt.
Das funktioniert so manchmal, aber oft erhalte ich gar keine Reaktion, obwohl das dimupdown-Event sicher ankommt.
Könnt Ihr mir helfen??
Vielen Dank im Voraus!
Ein komplettes list vom doif bitte...
Mit dem Handy online, daher kurz gefasst...
spontan beurteilt könnte das am fehlendem do always liegen, aber wie Frank shon sagt, bitte list vom DOIF.
So?
defmod mc_kueche_3_lang DOIF ([mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "on")\
(set MC_Kueche power standby,{Log3 "MC_Kueche",3,"Kurz warten nach Ausschalten"})\
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Umschalten auf NDR Info"},set mc_kueche_taste_3 dimup)\
DOELSEIF([mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "off")\
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR Info"},set mc_kueche_taste_3 dimup)
attr mc_kueche_3_lang room DOIF,Kueche
attr mc_kueche_3_lang wait 0,1
setstate mc_kueche_3_lang cmd_2
setstate mc_kueche_3_lang 2018-01-09 22:36:33 Device MC_Kueche
setstate mc_kueche_3_lang 2018-01-09 21:45:35 cmd 2
setstate mc_kueche_3_lang 2018-01-09 21:45:35 cmd_event mc_kueche_taste_3
setstate mc_kueche_3_lang 2018-01-09 21:45:35 cmd_nr 2
setstate mc_kueche_3_lang 2018-01-09 22:36:33 e_MC_Kueche_events FirmwareAvailable: 0
setstate mc_kueche_3_lang 2018-01-09 22:36:33 e_MC_Kueche_state off
setstate mc_kueche_3_lang 2018-01-09 22:22:56 e_mc_kueche_taste_3_events dimupdown
setstate mc_kueche_3_lang 2018-01-09 21:34:33 mode enabled
setstate mc_kueche_3_lang 2018-01-09 21:45:35 state cmd_2
setstate mc_kueche_3_lang 2018-01-09 21:45:35 wait_timer no timer
Und noch ein Nachtrag:
Das set ... dimup ist schon ein Versuch, das DOIF wieder "aufzuwecken", weil ich den Verdacht hatte, dass es nicht auslöst, weil sich der Status nicht geändert hat... hat aber nichts gebracht :(
Mit do always löst es unendlich aus, da die Taste im Status dimupdown stehen bleibt bis man was anderes drückt.
Danke für die prompten ersten Reaktionen!!!
naja, fast so...
list mc_kueche_3_lang
wäre besser.
ZitatMit do always löst es unendlich aus, da die Taste im Status dimupdown stehen bleibt bis man was anderes drückt.
Glaube ich nicht... das würde ja heißen, dass der Taster auch laufend events produziert, ich würde mal annehmen er bleibt im state "dimupdown", sendet aber nix.
Ich würde das nochmal überprüfen.
Nun nochmal als list- Danke für die Aufklärung :)
Internals:
DEF ([mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "on")
(set MC_Kueche power standby,{Log3 "MC_Kueche",3,"Kurz warten nach Ausschalten"})
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Umschalten auf NDR Info"})
DOELSEIF([mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "off")
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR Info"})
NAME mc_kueche_3_lang
NR 338
NTFY_ORDER 50-mc_kueche_3_lang
STATE initialized
TYPE DOIF
READINGS:
2018-01-10 09:04:44 Device MC_Kueche
2018-01-10 09:02:39 cmd 0
2018-01-10 09:04:44 e_MC_Kueche_events FirmwareAvailable: 0
2018-01-10 09:04:44 e_MC_Kueche_state off
2018-01-10 09:02:39 mode enabled
2018-01-10 09:02:39 state initialized
Regex:
condition:
0 EventDoIf('mc_kueche_taste_3',$hash,'dimupdown',1) and ReadingValDoIf($hash,'MC_Kueche','state') eq "on"
1 EventDoIf('mc_kueche_taste_3',$hash,'dimupdown',1) and ReadingValDoIf($hash,'MC_Kueche','state') eq "off"
devices:
0 mc_kueche_taste_3 MC_Kueche
1 mc_kueche_taste_3 MC_Kueche
all mc_kueche_taste_3 MC_Kueche
do:
0:
0 set MC_Kueche power standby,{Log3 "MC_Kueche",3,"Kurz warten nach Ausschalten"}
1 attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Umschalten auf NDR Info"}
1:
0 attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR Info"}
2:
helper:
DOIF_Readings_events
DOIF_eventas
event FirmwareAvailable: 0
globalinit 1
last_timer 0
sleeptimer -1
triggerDev MC_Kueche
triggerEvents:
FirmwareAvailable: 0
triggerEventsState:
FirmwareAvailable: 0
internals:
itimer:
readings:
0 MC_Kueche:state
1 MC_Kueche:state
all MC_Kueche:state
trigger:
all mc_kueche_taste_3
uiState:
uiTable:
Attributes:
room DOIF,Kueche
wait 0,1
Dass do always zu einer Dauerauslösung geführt hat, habe ich auch nicht verstanden. Der Taster sendet natürlich nicht dauernd und im Eventmonitor sehe ich auch nur ein Event.
Beim List oben nicht wundern. Das set ... dimup habe ich wieder entfernt, hat ja eh nicht geholfen 7nd war nur gedacht um eine erneute Statusänderung für das DOIF zu erzwingen.
Vielleicht hilft es: Ziemlich reproduzierbar löst der DOELSEIF-Zweig gar nicht aus.
Am besten gibst du uns noch die Events die der Taster erszeugt mit.
dimupdown stellt doch gewiss einen langen Tastendruck dar, oder? Könnte mir somit vorstellen, dass dieses Event so lange wiederholt gesendet wird, bis der Taster los gelassen wird. Daher wird das DOIF dann auch so oft getriggert, wie das Taster Device das Event raus haut.
Hat dieses Reading 'MC_Kueche:state' nur die beiden Werte 'on' und 'off' oder können da noch andere Werte drin stehen? z.B. 'standby'
Ja, dimupdown ist ein langer Tastendruck, somit wird das ggf. auch mehrfach gesendet.
Als ich do always gesetzt hatte, wurde das DOIF aber endlos oft ausgeführt :(
state von mc_kueche ist - soweit ich das bisher gesehen habe - nur on / off
Statt die Hälfte des Codes doppelt zu schreiben kannst du auch den zweiten Teil doppelt aufrufen: set $SELF cmd_2
[mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "on")
(set MC_Kueche power standby,{Log3 "MC_Kueche",3,"Kurz warten nach Ausschalten"})
(set $SELF cmd_2)
DOELSEIF ([mc_kueche_taste_3:"dimupdown"] and [MC_Kueche:state] eq "off")
(attr MC_Kueche FavoriteNetRadioChannel 2, set MC_Kueche TurnFavNetRadioChannelOn, {Log3 "MC_Kueche",3,"DOIF Einschalten mit NDR Info"},set mc_kueche_taste_3 dimup)
Natürlich zzgl. der hier im Thread gefundenen Fehlerbehebung ;).
do always ist natürlich notwendig, aber vllt. hilft dir cmdpause (https://fhem.de/commandref_DE.html#DOIF_cmdpause).
Zitat von: RockThisParty am 10 Januar 2018, 11:48:01
Als ich do always gesetzt hatte, wurde das DOIF aber endlos oft ausgeführt :(
das DOIF löst nur aus, wenn das EVENT vom Taster kommt. Und das kommt mit sicherheit nur wenn du selbigen drückst - Endlos kann also nicht sein. Wenn das EVENT oft kommt, dann ballert das DOIF auch oft - das ist klar.
Das kannst du durch cmdpause entprellen. Ich mache das nicht gerne so, nur wenn es nicht anders geht! Poste uns doch mal die Events, die von dem Taster bei langem Tastendruck erzeugt werden, evtl. kannst du auf etwas anderes als dimupdown regexen...
Zitat von: automatisierer am 10 Januar 2018, 13:28:41
das DOIF löst nur aus, wenn das EVENT vom Taster kommt.
Gutes Stichwort: checkReadingEvent (https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent) dürfte helfen!
Danke für die diversen Hinweise. Ich werde mal testen und berichten ... braucht aber etwas Zeit.
Feststellen konnte ich schon, dass die Dauerauslösung mit do always wohl eine einmalige Seltsamkeit war. Das ist jedenfalls bei den wenigen Tests, die ich heute machen konnte, nicht wieder aufgetreten.