Ich lasse beim klingeln des Telefons eine Lampe blinken. Wie stellt man DOIF ein damit es den Befehl so lange im Kreis laufen lässt bis "event" nicht mehr "ring" ist?
([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000; sleep 1; set LEDcontrol RGB 000000; sleep 1;)
Zitat von: accessburn am 14 Juni 2017, 19:06:07
Ich lasse beim klingeln des Telefons eine Lampe blinken. Wie stellt man DOIF ein damit es den Befehl so lange im Kreis laufen lässt bis "event" nicht mehr "ring" ist?
([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000; sleep 1; set LEDcontrol RGB 000000; sleep 1;)
https://fhem.de/commandref_DE.html#DOIF_repeatcmd
okay, so weit habe ich das verstanden, jedoch geiere ich auf den Status:
ZitatStatt Sekundenangaben können ebenfalls Status in eckigen Klammen oder Perlbefehle angegeben werden.
Wie müsste das denn aussehen? Wie vorne?
attr Anruf_blink repeatcmd [Fritzboxanrufe:event] eq "ring"
Sieht nicht aus als wäre das so gedacht
Zitat von: accessburn am 14 Juni 2017, 21:37:50
okay, so weit habe ich das verstanden, jedoch geiere ich auf den Status:
Wie müsste das denn aussehen? Wie vorne?
attr Anruf_blink repeatcmd [Fritzboxanrufe:event] eq "ring"
Sieht nicht aus als wäre das so gedacht
nee
zu deinem ursprünglichen DOIF definieren:
z. B.
attr Anruf_blink repeatcmd 60
wenn die Befehlsabfolge alle 60 Sekunden wiederholt werden soll
Der Befehl soll sich doch garnicht nach x Sekunden wiederholen. Die Ursprüngliche Frage lautete wie ich das DOIF dazu bekomme das es so lange im Kreis läuft wie der Fritzboxanrufstatus "ring" ist.
Zitat von: accessburn am 14 Juni 2017, 21:45:58
Der Befehl soll sich doch garnicht nach x Sekunden wiederholen. Die Ursprüngliche Frage lautete wie ich das DOIF dazu bekomme das es so lange im Kreis läuft wie der Fritzboxanrufstatus "ring" ist.
([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000; sleep 1; set LEDcontrol RGB 000000)
attr Anruf_blink repeatcmd 1
Teilerfolg... Jetzt blinkt es am Stück, hört aber gar nicht mehr auf. Der Status ist nicht mehr "ring", aber das wird da ja überhaupt nicht berücksichtigt.
Zitat von: accessburn am 14 Juni 2017, 21:58:16
Teilerfolg... Jetzt blinkt es am Stück, hört aber gar nicht mehr auf. Der Status ist nicht mehr "ring", aber das wird da ja überhaupt nicht berücksichtigt.
Dann wolle wir mal hoffen, dass du kein do always drin hast, sonst kann kein Zustandswechsel erfolgen und das Blinken hört nicht auf.
yeah... Das wars dann also.
Mal sehen ob ich da auch was gelernt hab, das Doif macht mir immer wieder Kopfweh.
Merci...
Zitat von: accessburn am 14 Juni 2017, 22:12:48
yeah... Das wars dann also.
Mal sehen ob ich da auch was gelernt hab, das Doif macht mir immer wieder Kopfweh.
Merci...
Nur zur Erklärung: Bei do always musst du einen weiteren Zustand definieren, wenn das Modul den Zustand wechseln soll, z. B. einfach DOELSE hinten dranhängen. Wenn du kein do always angibst, wird automatisch DOELSE (intern) drangehängt. Warum das so ist, steht in der Commandref zu DOIF ;)
Also hätte ich es drin lassen können, hätte nur ein ELSE gebraucht?
Sachen gibts...
Zitat von: accessburn am 14 Juni 2017, 22:18:34
Also hätte ich es drin lassen können, hätte nur ein ELSE gebraucht?
Sachen gibts...
So ist es. Hier die Stelle aus der Commandref:
ZitatSoll bei Nicht-Erfüllung aller Bedingungen ein Zustandswechsel erfolgen, so muss man ein DOELSE am Ende der Definition anhängen. Ausnahme ist eine einzige Bedingung ohne do always, wie im obigen Beispiel, hierbei wird intern ein virtuelles DOELSE angenommen, um bei Nicht-Erfüllung der Bedingung einen Zustandswechsel in cmd_2 zu provozieren, da sonst nur ein einziges Mal geschaltet werden könnte, da das Modul aus dem cmd_1-Zustand nicht mehr herauskäme.
Edit: DOIF ist halt auch ein kleiner Zustandsautomat ;)
Hallo Profi, du müsstest mir nochmal helfen dabei :-p
Ich hab das DOIF angelegt das es so lange ein LED String blinken lässt wie es klingelt: "AN; sleep 1; AUS; sleep 1;"
Das zweite Sleep muss also sein damit der Blinkeffekt auch da ist. Jedoch bekomme ich nun folgenden Log:
Zitat2017.06.16 11:21:13 1: WARNING: sleep without additional commands is deprecated and blocks FHEM
Hast du da eine Idee oder Geistesblitz zu?
bei mir hats geholfen, das dämliche sleep zu entfernen und aufs doif-interne wait umzusteigen.
https://fhem.de/commandref_DE.html#DOIF_wait
änderungen dazu:
bis jetzt hattest du als ausführungsteil:
(AN; sleep 1; AUS; sleep 1)
das änderst du in:
(AN;) (AUS;)
dazu in den attributen "wait" mit verögerungen für jede klammer
also z.b. 1,1 für 1 sek. beim ersten teilbefehl warten, 1 sek beim 2. teilbefehl warten
bei mehreren DOELSEIF arbeitest mit doppelpunkten - also: cmd_1.1,cmd_1.2,cmd_1.x:cmd_2.1,cmd_2.2,cmd_2.x:...
Würde das nicht zutreffen von "ring" das LED String nicht komplett in Anspruch nehmen?
Aktuell nutze ich es ja noch als normale Beleuchtung. Das würde dann wohl wegfallen, sehe ich das richtig?
verstehe die frage nicht ganz, interpretiere mal:
naja, blöd is vor allem, das dann die lampe aus ist nach dem telefonalarm, auch wenn sie vorher an war.
weiß ja ned, was du da verwendest, aber meine philips hue können alarme und merken sich dabei, wie der zusstand vorher war.
bei hue schaut dann ein befehl im doif zum einschalten so aus: set Buecherregal_RGB alert lselect;
und zum ausschalten so: set Buecherregal_RGB alert none;
das spart jegliche spielereien mit zeiten oder sonst was. ist wieder alles o.k, geht meine lampe somit in den vorherigen zustand über
Sagen wir mal so, es ist nicht so wichtig ob sie anschließend wieder an ist oder nicht.
Nur hab ich folgende Theorie mit dem DOIF mit zwei Klammern:
Die erste Klammer ist relevant wenn Telefon = ring, die zweite wenn das Telefon nicht klingelt. Müsste dann nicht immer, wenn das telefon gerade nicht klingelt das Licht ausgehen sobald ich es anschalte?
wenn es klingelt hat du deine befehle,
wenns nicht klingelt geht dein doif zum DOELSE und da gibts keine befehle.
du darfst halt nur keine befehle für den fall des nicht klingelns basteln.
jetzt versteh ich erst.
dachte das an und aus soll dein blinken sein.
Zitat von: the ratman am 16 Juni 2017, 13:27:55
jetzt versteh ich erst.
dachte das an und aus soll dein blinken sein.
Ahhh, da hab ich es also versäumt zu erklären. Ja das der String kann nicht selbstständig blinken, ich muss ihn einschalten, warten, ausschalten, warten ....
Ich hab es mal so konfiguriert wie du sagtest, die frage ist, ist es jetzt noch gültig wo du verstanden hast was ich dachte statt zu sagen :D
Zitat
Internals:
DEF ([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000;) (set LEDcontrol RGB 000000;) DOELSE ()
NAME Anruf_blink
NR 470
NTFY_ORDER 50-Anruf_blink
STATE initialized
TYPE DOIF
Readings:
2017-06-16 13:32:48 cmd 0
2017-06-16 13:32:48 state initialized
2017-06-16 13:34:55 wait_timer no timer
Condition:
0 ReadingValDoIf($hash,'Fritzboxanrufe','event') eq "ring"
Devices:
0 Fritzboxanrufe
all Fritzboxanrufe
Do:
0:
0 set LEDcontrol RGB FF0000;
1 set LEDcontrol RGB 000000;
1:
0
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Itimer:
Readings:
0 Fritzboxanrufe:event
all Fritzboxanrufe:event
Regexp:
All:
State:
State:
Attributes:
repeatcmd 1
wait 1,1
das müsste so hinhauen - ruf dich halt mal an *g*
Bringt nix, niemand daheim der glotzen kann :-)
Aber ich machs trotzdem mal ;D
hat da einer noch keinen tunnel zu seinem fhem?
btw ich bin von dieser blinkerei weg und lass mir per amad/dlna ansagen wer anruft und am ende, wie lange der anruf gedauert hat.
wenn du also n tablet fürs wohnzimmer oder z.b. auch dlna-lautsprecher hast ...
Hab ich, aber ich sage es mal so, ich bin ein Fan von lauter Musik :-D
Also laut FHEM Status scheint es zu klappen. Aber ich kann es halt nicht Live sehen ob es funktioniert, aber scheint zu gehen.
wow, dann hats bei mir also nur 1 jahr gedauert, bis ich jemanden bei fhem sinnvoll helfen konnt ...
naja, wenns besser geht, wird sich sowieso damian melden - der mags nicht, wenn man sein modul falsch mißbraucht (scheint mir)
btw - elegant wärs natürlich, wenn du deine musik per mtp/icecast2 oder ähnlichem streamst. so machs ich, wenn mir die qualität ned gar so wichtig is zu dem zeitpunkt.
dann kann man nämlich wunderbar die musik leiser schalten, durchsage machen, musik wieder auf 100% fahren.
zahlt sich aber nur aus, wenn du brauchbare boxen-hardware iwe z.b. sonos, squeezebox, ... hast. bei meiner billigsdorfer-lösung weiß ich nämlich ned, wie lang der text rennt und kann nur schätzen, wie lange die musik leise sein muß. gibt lustige effekte.
Ja Alexa spielt ab, ich warte noch bisschen und will ihr dann befehlen das sie die Klappe halten soll bei einem eingehenden Anruf.
Aber das kommt langsam alles nach.
Aber die Blinkerei ist schonmal ein guter Anfang.
Nachtrag!
Das DOIF hat einen faden beigeschmack:
([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000;) (set LEDcontrol RGB 000000;) DOELSE ()
Wenn ich den Anruf annehme während das Licht gerade an ist beim blinken, bleibt es an, wenn es aus ist a.t.m. bleibt es aus.
Jemand da einen Geistesblitz dazu?
Zitat von: accessburn am 24 Juli 2017, 17:01:04
Nachtrag!
Das DOIF hat einen faden beigeschmack:
([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000;) (set LEDcontrol RGB 000000;) DOELSE ()
Wenn ich den Anruf annehme während das Licht gerade an ist beim blinken, bleibt es an, wenn es aus ist a.t.m. bleibt es aus.
Jemand da einen Geistesblitz dazu?
([Fritzboxanrufe:event] eq "ring") (set LEDcontrol RGB FF0000) (set LEDcontrol RGB 000000) DOELSE (set LEDcontrol RGB 000000)
Wieder spricht der natürlichen Sache des Lichtes :-) Es Leuchtet, auch mal beim gemütlichen fernsehen. Mit dieser Variante wäre es doch dann dauernd aus wenn nicht gerade das Telefon klingelt, oder irre ich da?
Zitat von: accessburn am 24 Juli 2017, 17:27:51
Wieder spricht der natürlichen Sache des Lichtes :-) Es Leuchtet, auch mal beim gemütlichen fernsehen. Mit dieser Variante wäre es doch dann dauernd aus wenn nicht gerade das Telefon klingelt, oder irre ich da?
Zwischenspeichern
([Fritzboxanrufe:event] eq "ring") (setreading $SELF T_empRGB [LEDcontrol:RGB], set LEDcontrol RGB FF0000) (set LEDcontrol RGB 000000) DOELSE (set LEDcontrol RGB [$SELF:T_empRGB])
Zwischenspeichern... das war der Geistesblitz den ich brauchte. Ich hab als an dem DOIF selbst gebastelt und mich 200 mal angerufen :-)
Danke für das Workaround.
Funktioniert nicht so ganz:
Bei jedem zweiten Aufruf wird T_empRGB mit der aktuellen Farbe überschrieben, das reading müsste also gesetzt werden ohne das es bei jedem Blinkvorgang wieder neu geschrieben wird.
([Fritzboxanrufe:event] eq "ring") (setreading $SELF T_empRGB [LEDcontrol:RGB];set $SELF cmd_2)
DOELSIF (0) (set LEDcontrol RGB FF0000) (set LEDcontrol RGB 000000)
DOELSEIF ([Fritzboxanrufe:event] ne "ring") (set LEDcontrol RGB [$SELF:T_empRGB])
und
attr Fritzboxanrufe event-on-change-reading .*
Okay, abgesehen davon das jetzt überhaupt nichts mehr geht verstehe ich davon kein Wort mehr :'(
Hier mal der aktuelle Zwischenstand:
ZitatInternals:
DEF ([Fritzboxanrufe:event] eq "ring") (setreading $SELF T_empRGB [LEDcontrol:RGB]; set $SELF cmd_2)
DOELSEIF (0) (set LEDcontrol RGB FF0000) (set LEDcontrol RGB 000000)
DOELSEIF ([Fritzboxanrufe:event] ne "ring") (set LEDcontrol RGB [$SELF:T_empRGB])
NAME Anruf_blink
NR 470
NTFY_ORDER 50-Anruf_blink
STATE cmd_3
TYPE DOIF
READINGS:
2017-07-25 14:57:38 Device Fritzboxanrufe
2017-07-25 14:57:37 T_empRGB 000000
2017-07-25 14:57:38 cmd 3
2017-07-25 14:57:38 cmd_event Fritzboxanrufe
2017-07-25 14:57:38 cmd_nr 3
2017-07-25 14:57:38 e_Fritzboxanrufe_event connect
2017-07-25 14:57:38 state cmd_3
2017-07-25 14:57:38 wait_timer no timer
condition:
0 ReadingValDoIf($hash,'Fritzboxanrufe','event') eq "ring"
1 0
2 ReadingValDoIf($hash,'Fritzboxanrufe','event') ne "ring"
devices:
0 Fritzboxanrufe
2 Fritzboxanrufe
all Fritzboxanrufe
do:
0:
0 setreading Anruf_blink T_empRGB [LEDcontrol:RGB]; set Anruf_blink cmd_2
1:
0 set LEDcontrol RGB FF0000
1 set LEDcontrol RGB 000000
2:
0 set LEDcontrol RGB [Anruf_blink:T_empRGB]
3:
helper:
event event: connect
globalinit 1
last_timer 0
sleepdevice Fritzboxanrufe
sleepsubtimer 0
sleeptimer -1
timerdev Fritzboxanrufe
timerevent event: connect
triggerDev Fritzboxanrufe
timerevents:
event: connect
timereventsState:
event: connect
triggerEvents:
event: connect
triggerEventsState:
event: connect
internals:
itimer:
readings:
0 Fritzboxanrufe:event
2 Fritzboxanrufe:event
all Fritzboxanrufe:event
regexp:
0:
1:
2:
all:
state:
STATE:
trigger:
Attributes:
repeatcmd 1
wait 1,1
Ich tendiere dazu das es
wait ist, aber
1,1:1,1 ist schon mal falsch.
Bei der aktuellen Konfiguration geht das Licht beim anruf einfach aus und ende.
Zitat von: accessburn am 25 Juli 2017, 14:59:06Ich tendiere dazu das es wait ist, aber 1,1:1,1 ist schon mal falsch.
Ja.
wait 0:1,1:0
repeatcmd 1:1:1
repeatsame 1:0:1
Alle drei Attribute beziehen sich auf den jeweiligen DO-Fall.
Zitat von: accessburn am 25 Juli 2017, 13:02:51
Funktioniert nicht so ganz:
Bei jedem zweiten Aufruf wird T_empRGB mit der aktuellen Farbe überschrieben, das reading müsste also gesetzt werden ohne das es bei jedem Blinkvorgang wieder neu geschrieben wird.
Ich hatte repeatcmd übersehen.
Statt
(setreading $SELF T_empRGB [LEDcontrol:RGB], set LEDcontrol RGB FF0000)
etwa so
(IF (ReadingsAge("LEDcontrol","RGB",0) > 5) (setreading $SELF T_empRGB [LEDcontrol:RGB]), set LEDcontrol RGB FF0000)
Sorry, aber das klappt auch nicht. Weder blinkt es, noch wird T_empRGB auf die Ursprungsfarbe geschrieben sondern ändert sich im zwei Sekundentakt. Ich bin mit meiner Pseudo-Weißheit am Ende.
Zitat von: accessburn am 25 Juli 2017, 16:26:32
Sorry, aber das klappt auch nicht. Weder blinkt es, noch wird T_empRGB auf die Ursprungsfarbe geschrieben sondern ändert sich im zwei Sekundentakt. Ich bin mit meiner Pseudo-Weißheit am Ende.
Hast Du alles richtig geschrieben?
Stimmen alle Klammern?
Ändert sich der Zeitsempel von LEDcontrol:RGB?
Gibt es Fehlermelungen?
Leider wird das Listing nicht angezeigt!
Zitat von: accessburn am 25 Juli 2017, 16:26:32
Sorry, aber das klappt auch nicht. Weder blinkt es, noch wird T_empRGB auf die Ursprungsfarbe geschrieben sondern ändert sich im zwei Sekundentakt. Ich bin mit meiner Pseudo-Weißheit am Ende.
Dann wird es langsam Zeit für eine funktionsfähige Lösung:
([Fritzboxanrufe:event] eq "ring") (setreading $SELF zustand [LEDcontrol:RGB], set LEDcontrol RGB FF0000)
DOELSEIF ([$SELF] =~ "cmd_1|cmd_3") (set LEDcontrol RGB 000000)
DOELSEIF ([$SELF] eq "cmd_2") (set LEDcontrol RGB FF0000)
DOELSEIF ([Fritzboxanrufe:event] ne "ring") (set LEDcontrol RGB [$SELF:zustand])
attr selftrigger all
attr wait 0:1:1
Ich gehe davon aus, dass im Reading RGB bei LEDcontrol der aktuelle Zustand (FF0000 bzw. 00000) steht.
P.S. repeadcmd hat mit Selbsttriggerung offenbar noch Probleme
Ich habe repeatcmd gefixed.
([Fritzboxanrufe:event] eq "ring") (setreading $SELF zustand [LEDcontrol:RGB])
DOELSEIF ([$SELF:state] eq "cmd_1") (set LEDcontrol RGB 000000) (set LEDcontrol RGB FF0000)
DOELSEIF ([Fritzboxanrufe:event] ne "ring") (set LEDcontrol RGB [$SELF:zustand])
attr selftrigger all
attr wait 0:0,1
attr repeatcmd 0:1
attr checkReadingEvent 1
Übersetzt bedeutet das: wenn es klingelt:[Fritzboxanrufe:event] eq "ring" merke Zustand von [LEDcontrol:RGB] ->Übergang in den zweiten DO-Fall:[$SELF:state] eq "cmd_1"-> wiederhole an,aus bis dritter DO-Fall eintritt: [Fritzboxanrufe:event] ne "ring" -> setze auf den gemerkten Zustand zurück
Ab morgen per Update verfügbar oder sofort unter : https://svn.fhem.de/trac/browser/trunk/fhem/FHEM?order=date&desc=1
Mein Held, mein Held ;D
Es geht... Kann ich das trotzdem so lassen nach dem Update? Denn es funktioniert perfekt :-)
Zitat von: accessburn am 26 Juli 2017, 13:28:16
Mein Held, mein Held ;D
Es geht... Kann ich das trotzdem so lassen nach dem Update? Denn es funktioniert perfekt :-)
Ja. Nach dem Update werden beide Versionen funktionieren.