wiederholtes Triggern eines notify (macro)

Begonnen von ujaudio, 25 März 2019, 14:19:21

Vorheriges Thema - Nächstes Thema

ujaudio

Problemstellung: ich habe einen Verstärker, der nur über IR zu steuern ist, das mache ich mit Logitec Harmony. Nun möchte ich im Floorplan einen Slider haben, mit dem ich die Lautstärke beliebig einstellen kann und der Verstärker soll dem "sanft" folgen. Dazu habe ich folgendes definiert:
1. Ein Dummy "hv_aaronSollLautstaerke" für den Slider.
2. Ein Dummy "hv_aaronVolume" für die Ist-Lautstärke, wobei angenommen ist, dass alle Harmony-Befehle umgesetzt werden und niemand lokal am Gerät bedient.

Des weiteren habe ich ein Macro:
define hv_aaronVolumeMacro notify hv_aaronVolumeMacro {\
  my $volume = Value("hv_aaronVolume");;\
  if (Value("hv_aaronSollLautstaerke") > $volume){\
    $volume += 1;;\
    fhem("set hv_harmony_29538368 command VolumeUp;;\
      defmod hv_aaronVolumeRetrigger at +00:00:01 trigger hv_aaronVolumeMacro")\
  }\
  if (Value("hv_aaronSollLautstaerke") < $volume){\
    $volume -= 1;;\
    fhem("set hv_harmony_29538368 command VolumeDown;;\
      defmod hv_aaronVolumeRetrigger at +00:00:01 trigger hv_aaronVolumeMacro")\
  }\
  fhem("set hv_aaronVolume $volume")\
}

welches bei Ungleichheit von Soll und Ist alle Sekunde am Verstärker "um eins" weiterschaltet und ein Notify
define hv_aaronVolumeInit notify hv_aaronSollLautstaerke:.* trigger hv_aaronVolumeMacro

welches das Nachführen anstößt, wenn ich den Slider bewege.

Soweit die Theorie, leider funktioniert das in der Praxis noch nicht: Bewege ich den Slider schnell
z.B. von 0 auf 20, dann geht der Verstärker auf 0 auf 2
oder anderes Beispiel
von 30 auf 25, dann geht der Verstärker auf 30 auf 28

Das Macro wird also einmal angestoßen, läuft durch, wird ein 2. Mal angestoßen und dann funktioniert das "retriggern" nicht mehr. Das kann man mit verbose = 4 auch im Logfile nachvollziehen.

Ich habe mich jetzt (mit Pausen) schon stundenlang damit beschäftigt, aber ich kann nichts finden, was mich auf die richtige Spur bringt den Fehler zu beheben. Was könnte ich noch überprüfen? Oder habe ich mal wieder einen Logikfehler?

Einen lieben Gruß
Jürgen
Einen lieben Gruß
Jürgen

Wzut

Schuss ins Blaue : es gibt keinen dritten Lauf weil der zweite über das at geht und es sich selbst dabei erneuern müsste.
Vorschlag : ändere die at Namen, so das sie pro Durchlauf anderes lauten , zb. hänge den  Volume Wert an
defmod hv_aaronVolumeRetrigger_$volume at +00:00:01 trigger hv_aaronVolumeMacro")
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Byte09

Hilfe , da erschlagen mich ja die devices und macros. Spricht etwas dagegen , daß alles in ein Device zu packen ?

Ich könnte dir das alles in ein MSwitch bauen , für solche komplexen Vorgänge ist das Modul gemacht.


Gruss Byte09

Gesendet von meinem SM-G900F mit Tapatalk


Byte09

#3
hier wäre mal ein grundgerüst, wobei hier noch keine aktualisierung der ist lautstärke stattfindet, wenn du mit der harmony die lautstärke änderst.

Falls du es damit versuchen möchtest baue ich dir gerne bei bedarf ein , wenn du mir sagst, wie du den dummy 'hv_aaronVolume' auf dem laufendan hälst.

Das Modul ist über die Weboberfläche konfigurierbar und im grossen und ganze 'selbsterklärend' ( ansonsten attribut 'MSwitch_Help' auf 1 setzen und/oder Wiki)

gruss Byte09

defmod ist_soll MSwitch ist_soll   # FreeCmd MSwitch_Self
attr ist_soll MSwitch_Debug 1
attr ist_soll MSwitch_Delete_Delays 1
attr ist_soll MSwitch_Expert 0
attr ist_soll MSwitch_Extensions 0
attr ist_soll MSwitch_Help 0
attr ist_soll MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul
attr ist_soll MSwitch_Include_Devicecmds 1
attr ist_soll MSwitch_Include_MSwitchcmds 0
attr ist_soll MSwitch_Include_Webcmds 0
attr ist_soll MSwitch_Inforoom MSwitch
attr ist_soll MSwitch_Lock_Quickedit 1
attr ist_soll MSwitch_Mode Notify
attr ist_soll readingList IST SOLL
attr ist_soll room 1_test
attr ist_soll setList IST SOLL:slider,0,1,20
attr ist_soll stateFormat IST
attr ist_soll webCmd SOLL

setstate ist_soll 12
setstate ist_soll 2019-03-25 16:35:37 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,MSwitch_Self-AbsCmd1
setstate ist_soll 2019-03-25 16:38:31 .Device_Affected_Details FreeCmd-AbsCmd1#[NF]cmd#[NF]cmd#[NF]{#[nl]my#[sp]$soll#[sp]=#[sp][$SELF#[dp]SOLL]#[se]#[nl]my#[sp]$ist#[sp]=#[sp][$SELF#[dp]IST]#[se]#[nl]$ist#[sp]=#[sp]$ist#[sp]-1#[se]#[nl]fhem("setreading#[sp]$SELF#[sp]IST#[sp]$ist")#[se]#[nl]#[nl]##[sp]hier#[sp]befehl#[sp]für#[sp]lautstärke#[sp]minus#[nl]#[nl]}#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]00#[NF]00#[dp]00#[dp]00#[NF][$SELF#[dp]SOLL]<[$SELF#[dp]IST]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]1#[ND]FreeCmd-AbsCmd2#[NF]cmd#[NF]cmd#[NF]{#[nl]my#[sp]$soll#[sp]=#[sp][$SELF#[dp]SOLL]#[se]#[nl]my#[sp]$ist#[sp]=#[sp][$SELF#[dp]IST]#[se]#[nl]$ist#[sp]=#[sp]$ist#[sp]+1#[se]#[nl]fhem("setreading#[sp]$SELF#[sp]IST#[sp]$ist")#[se]#[nl]#[nl]##[sp]hier#[sp]befehl#[sp]für#[sp]lautstärke#[sp]plus#[nl]#[nl]}#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]00#[NF]00#[dp]00#[dp]00#[NF][$SELF#[dp]SOLL]>[$SELF#[dp]IST]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]1#[ND]MSwitch_Self-AbsCmd1#[NF]exec_cmd_1#[NF]no_action#[NF]#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]01#[NF]00#[dp]00#[dp]00#[NF][$SELF#[dp]SOLL]#[sp]!=#[sp][$SELF#[dp]IST]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]1
setstate ist_soll 2019-03-25 16:41:08 .Device_Events last_exec_cmd:  {my $soll = 7;;my $ist = 13;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:7#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 10;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]IST:13#[tr]IST:17#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 15;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 10;;my $ist = 9;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:10#[tr]last_exec_cmd:  {my $soll = 7;;my $ist = 9;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:set ist_soll exec_cmd_1 #[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 12;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_activation_by:event#[tr]IST:9#[tr]IST:18#[tr]last_exec_cmd:  {my $soll = 7;;my $ist = 14;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:18#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 9;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 13;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]IST:7#[tr]last_exec_cmd:  {my $soll = 7;;my $ist = 8;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 18;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 16;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]IST:8#[tr]IST:12#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 17;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 14;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]IST:14#[tr]IST:15#[tr]IST:20#[tr]IST:16#[tr]last_exec_cmd:  {my $soll = 10;;my $ist = 8;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 11;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 12;;my $ist = 13;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 20;;my $ist = 19;;$ist = $ist +1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:8#[tr]last_exec_cmd:  {my $soll = 12;;my $ist = 15;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 7;;my $ist = 12;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:14#[tr]IST:10#[tr]SOLL:12#[tr]last_exec_cmd:  {my $soll = 7;;my $ist = 10;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]state:active#[tr]last_exec_cmd:  {my $soll = 18;;my $ist = 19;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:6#[tr]last_exec_cmd:  {my $soll = 12;;my $ist = 17;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]SOLL:20#[tr]SOLL:11#[tr]IST:19#[tr]last_exec_cmd:  {my $soll = 12;;my $ist = 14;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 12;;my $ist = 16;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]last_exec_cmd:  {my $soll = 7;;my $ist = 11;;$ist = $ist -1;;fhem([dst]setreading ist_soll IST $ist[dst]);;}#[tr]IST:11
setstate ist_soll 2019-03-25 16:20:03 .First_init done
setstate ist_soll 2019-03-25 16:41:08 .Trigger_cmd_off no_trigger
setstate ist_soll 2019-03-25 16:41:08 .Trigger_cmd_on SOLL:.*
setstate ist_soll 2019-03-25 16:26:17 .Trigger_condition
setstate ist_soll 2019-03-25 16:41:08 .Trigger_off no_trigger
setstate ist_soll 2019-03-25 16:41:08 .Trigger_on no_trigger
setstate ist_soll 2019-03-25 16:26:17 .Trigger_time
setstate ist_soll 2019-03-25 16:20:03 .V_Check V2.00
setstate ist_soll 2019-03-25 16:41:08 EVENT state:active
setstate ist_soll 2019-03-25 16:41:08 EVTFULL ist_soll:state:active
setstate ist_soll 2019-03-25 16:41:08 EVTPART1 ist_soll
setstate ist_soll 2019-03-25 16:41:08 EVTPART2 state
setstate ist_soll 2019-03-25 16:41:08 EVTPART3 active
setstate ist_soll 2019-03-25 16:41:04 IST 12
setstate ist_soll 2019-03-25 16:40:57 SOLL 12
setstate ist_soll 2019-03-25 16:26:17 Trigger_device MSwitch_Self
setstate ist_soll 2019-03-25 16:41:08 Trigger_log off
setstate ist_soll 2019-03-25 16:41:08 last_activation_by event
setstate ist_soll 2019-03-25 16:41:08 last_event state:active
setstate ist_soll 2019-03-25 16:41:04 last_exec_cmd set ist_soll exec_cmd_1
setstate ist_soll 2019-03-25 16:41:08 state active


ujaudio

Zitat von: Wzut am 25 März 2019, 14:57:14
Schuss ins Blaue : es gibt keinen dritten Lauf weil der zweite über das at geht und es sich selbst dabei erneuern müsste.
Vorschlag : ändere die at Namen, so das sie pro Durchlauf anderes lauten , zb. hänge den  Volume Wert an
defmod hv_aaronVolumeRetrigger_$volume at +00:00:01 trigger hv_aaronVolumeMacro")

So funktioniert es - aber verstanden habe ich es noch nicht:

* das Macro läuft und definiert ein at, welches erst nach einer Sekunde wirksam wird
* inzwischen ist das Macro durchgelaufen
* das at triggert erneut das Macro und ist fertig, nach meinem Verständnis sollte da nichts übrig bleiben
* das Macro läuft durch und defmod löscht ein etwaiges vorhandenes at und definiert ein neues

Da es so nicht funktioniert habe ich also 2 Denkfehler: erstens beendet sich das at nicht schnell genug und zweitens funktioniert defmod anders als ich dachte: es löscht nicht, sondern definiert nur, wenn es noch kein Device mit diesem Namen gibt. Das wäre dann wohl die Erklärung.

Einen lieben Gruß
Jürgen
Einen lieben Gruß
Jürgen

ujaudio

Zitat von: Byte09 am 25 März 2019, 16:07:06
Hilfe , da erschlagen mich ja die devices und macros. Spricht etwas dagegen , daß alles in ein Device zu packen ?

Ich könnte dir das alles in ein MSwitch bauen , für solche komplexen Vorgänge ist das Modul gemacht.


Gruss Byte09

Gesendet von meinem SM-G900F mit Tapatalk

Danke, das werde ich mir mal in aller Ruhe anschauen - wieder mal ein mir bislang unbekanntes Modul kennengelernt. Ich habe den Wiki-Beitrag schon gefunden...

Einen lieben Gruß
Jürgen
Einen lieben Gruß
Jürgen