Hallo zusammen,
ich komme mit einer, eigentlich trivialen, Anforderung an ein DOIF nicht klar.
Und zwar möchte ich, beim Klick auf eine Taste dafür sorgen, dass eine Sonos-Box so lange die Lautstärke verringert bis man die Taste los lässt.
Das DOIF dazu sieht wie folgt aus:
([S4_Schlafzimmer.4] eq "VolDown") (set Sonos_Wohnzimmer VolumeD 5)
Zusätzlich habe ich do always als Attribut gesetzt.
Es funktioniert nun soweit, dass sich bei jedem Druck auf die Taste die Lautstärke um 5 verringert. Schon mal gut.
Halte ich die Taste aber gedrückt, verändert sich die Lautstärke auch nur einmal um 5, aber nicht wiederholt.
Was mich aber insofern wundert, da die Bedingung weiterhin erfüllt ist. Der State von S4_Schlafzimmer.4 wird erst dann von "VolDown" auf "swmEnd" umgesetzt, wenn ich die Taste los lasse. Das habe ich auch so im Event Log bestätigt bekommen.
Ich hatte die Vermutung dass eventuell das Command zu schnell ausgelöst und daher ignoriert wird. Daher habe ich auch mal testweise cmdpause auf 1 gesetzt, aber das hat auch nichts verändert.
Kann mir jemand bei meinem Denkfehler helfen?
Danke schon mal
Ejfu
Ich glaube nicht das es so geht. Es kann immer nur auf ein Event reagiert werden. Und ein Event gibt es nur wenn sich was verändert.
Was Du machen kannst ist eine Schleife mit Bedingung.
Führe "set Sonos_Wohnzimmer VolumeD 5" so lange aus, so lange [S4_Schlafzimmer.4 eq "VolDown"] erfüllt ist und VolumeD > 0 ist
Grüße
Ah, ich hatte es so verstanden, dass DOIF auf den Zustand reagiert und weil der sich ja nicht ändert, solange ich die Taste gedrückt halte, ...
Aber gut, war dann ein Verständnisfehler und erklärt, weshalb es so nicht funktioniert.
Werde dann mal entsprechend in den cmd-Teil des DOIFs eine Perl-Schleife einbauen und es mit dieser behandeln. Danke für den Tipp!
Viele Grüße,
Ejfu
Es gab im Forum mal so eine Fragestellung und der TE hat es auch gelöst - soweit mich nicht alles täuscht.
Aber ich weiß nicht in welchem Bereich.
Quäl mal die Forumssuche ein bischen mit unterschiedlichen Stichwörtern - vielleicht wirst du ja fündig.
Ohne Gewähr - ich kann mich auch irren.
Danke für den Hinweis!
Bin, nach hin und her mit unterschiedlichen Stichwörtern, letztlich bei http://forum.fhem.de/index.php/topic,39925.msg322153.html#msg322153 gelandet und habe dann dort einen guten Ansatz ganz ohne Schleife gefunden.
Müsste sich problemlos adaptieren lassen.
Viele Grüße,
Ejfu
Tja, das leidige Thema im Forum.
Es wird nur gepostet das "es geht" aber nicht "wie es geht".
Aber gut, da seid ihr Anfänger (allgemein) auch selbst schuld - ich bitte in meinem angepinnten Beitrag sogar darum die Lösung passend zu posten.
Zitat von: Puschel74 am 03 September 2015, 19:23:41
Tja, das leidige Thema im Forum.
Es wird nur gepostet das "es geht" aber nicht "wie es geht".
ich habe ja gar nicht behauptet, dass es geht. Sondern nur, dass sich der Ansatz adaptieren lassen müsste :-)
Und weiter bin ich bis heute noch gar nicht gekommen, weil ich keine Zeit zum Ausprobieren hatte.
Es lässt sich aber prima mit
([S4_Schlafzimmer.2] eq "VolUp" and ([Sonos_Wohnzimmer:Volume] >95)) (set Sonos_Wohnzimmer Volume 100) DOELSEIF ([S4_Schlafzimmer.4] eq "VolDown" and ([Sonos_Wohnzimmer:Volume] <5)) (set Sonos_Wohnzimmer Volume 0) DOELSEIF ([S4_Schlafzimmer.2] eq "VolUp" and ([Sonos_Wohnzimmer:Volume] <=95)) (set Sonos_Wohnzimmer VolumeU 5) DOELSEIF ([S4_Schlafzimmer.4] eq "VolDown" and ([Sonos_Wohnzimmer:Volume] >=5)) (set Sonos_Wohnzimmer VolumeD 5)
lösen.
Dadurch, dass das Reading durch die Erhöhung/Verringerung der Lautstärke aktualisiert wird, löst auch das DOIF wieder aus.
Außerdem hat man automatisch einen gewissen Zeitversatz drin, weil das Reading eine gefühlte Sekunde zur Aktualisierung benötigt.
Kann man sicherlich analog auch für Lampen nutzen.
Viele Grüße,
Ejfu
Ich hatte auch nicht dich gemeint sondern deinen verlinkten Beitrag ;)