Hauptmenü

DOIF: set_Exec-Aufruf?

Begonnen von gestein, 22 Oktober 2020, 18:00:10

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich möchte gerne jeden Donnerstag (außer Feiertags) um 7:30 eine Durchsage bekommen, die 2 mal wiederholt werden soll.
Dafür hätte ich mir gedacht, dass ich den set_Exec-Befehl nehme, komme damit aber leider nicht klar.

Das DOIF hätte ich so formuliert:
defmod di_Geige_Erinnerung DOIF ([07:28-07:40|4] and !$we) {\
fhem("set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>");;;;\
set_Exec("timer_Geige",'$count*120','fhem("set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Bitte die Geige nicht vergessen.</speak>")','$count<2');;;;\
}
attr di_Geige_Erinnerung room 0_Testing


Wenn ich den set_Exec-Befehl rausnehme, dann klappt es mit einem "set di_Geige_Erinnerung block_01" (zumindest geht also der fhem()-Aufruf).
Sobald ich set_Exec dazugebe, bekomme ich den Fehler:
Undefined subroutine &main::set_Exec called at (eval 8858387) line 1.

Kann mir bitte jemand sagen, was ich da falsch mache?

Danke im Voraus
lg, Gerhard

Damian

Zitat von: gestein am 22 Oktober 2020, 18:00:10
Hallo,

ich möchte gerne jeden Donnerstag (außer Feiertags) um 7:30 eine Durchsage bekommen, die 2 mal wiederholt werden soll.
Dafür hätte ich mir gedacht, dass ich den set_Exec-Befehl nehme, komme damit aber leider nicht klar.

Das DOIF hätte ich so formuliert:
defmod di_Geige_Erinnerung DOIF ([07:28-07:40|4] and !$we) {\
fhem("set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>");;;;\
set_Exec("timer_Geige",'$count*120','fhem("set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Bitte die Geige nicht vergessen.</speak>")','$count<2');;;;\
}
attr di_Geige_Erinnerung room 0_Testing


Wenn ich den set_Exec-Befehl rausnehme, dann klappt es mit einem "set di_Geige_Erinnerung block_01" (zumindest geht also der fhem()-Aufruf).
Sobald ich set_Exec dazugebe, bekomme ich den Fehler:
Undefined subroutine &main::set_Exec called at (eval 8858387) line 1.

Kann mir bitte jemand sagen, was ich da falsch mache?

Danke im Voraus
lg, Gerhard

set_Exec funktioniert nur im DOIF-Perlmodus, daher;

defmod di_Geige_Erinnerung DOIF {if ([07:28-07:40|4] and !$we) {\
fhem("set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>");;;;\
set_Exec("timer_Geige",'$count*120','fhem("set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Bitte die Geige nicht vergessen.</speak>")','$count<2');;;;\
}
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo Damian,

vielen Dank.
Da bin ich wohl beim vielen Herumprobieren irgendwo falsch abgebogen.
Denn so steht es ja auch in der Anleitung und es scheint auch zu funktionieren.
Bin jetzt am Testen und ein bisschen erweitern dran ;)

Eine Frage noch zu set_Exec:
Ich würde gerne zwei Parameter im Aufruf durch Readings ersetzen.
Im fhem-Aufruf klappt das mit:
{ my $cmd="set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 ". ReadingsVal("dyParameter","Stimme_Nachrichten_Vol","30")." ".ReadingsVal("dyParameter","Stimme_Nachrichten","Vicki")." <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>";

Log 1, "di_Geige_Erinnerung: $cmd;";
fhem($cmd);;
# set_Exec("timer_Geige",'$count*120',"fhem($cmd)",'$count<3');;
}
}


Beim set-Exec klappt das leider nicht. Da führt der Aufruf mit:
set_Exec("timer_Geige",'$count*120',"fhem($cmd)",'$count<3');;
zu folgender Fehlermeldung:
2020.10.23 09:38:45.417 1: PERL WARNING: Bareword found where operator expected at (eval 10833430) line 1, near "1 Speak1"
2020.10.23 09:38:45.418 1: PERL WARNING: Number found where operator expected at (eval 10833430) line 1, near "Speak1 30"
2020.10.23 09:38:45.418 1: PERL WARNING: Bareword found where operator expected at (eval 10833430) line 1, near "30 Vicki"
2020.10.23 09:38:45.418 1: di_Geige_Erinnerung error in fhem(set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>): syntax error at (eval 10833430) line 1, near "):"


Und wenn ich das wie folgt mache:
set_Exec("timer_Geige",'$count*120','fhem($cmd)','$count<3');;
Dann kommt die Fehlermeldung:
2020.10.23 09:45:12.603 1: di_Geige_Erinnerung error in fhem($cmd): Global symbol "$cmd" requires explicit package name (did you forget to declare "my $cmd"?) at (eval 10847088) line 1.

Wie rufe ich das set_Exec richtig auf?

Danke im Voraus
lg, Gerhard

Damian

Zitat von: gestein am 23 Oktober 2020, 09:49:35
Hallo Damian,

vielen Dank.
Da bin ich wohl beim vielen Herumprobieren irgendwo falsch abgebogen.
Denn so steht es ja auch in der Anleitung und es scheint auch zu funktionieren.
Bin jetzt am Testen und ein bisschen erweitern dran ;)

Eine Frage noch zu set_Exec:
Ich würde gerne zwei Parameter im Aufruf durch Readings ersetzen.
Im fhem-Aufruf klappt das mit:
{ my $cmd="set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 ". ReadingsVal("dyParameter","Stimme_Nachrichten_Vol","30")." ".ReadingsVal("dyParameter","Stimme_Nachrichten","Vicki")." <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>";

Log 1, "di_Geige_Erinnerung: $cmd;";
fhem($cmd);;
# set_Exec("timer_Geige",'$count*120',"fhem($cmd)",'$count<3');;
}
}


Beim set-Exec klappt das leider nicht. Da führt der Aufruf mit:
set_Exec("timer_Geige",'$count*120',"fhem($cmd)",'$count<3');;
zu folgender Fehlermeldung:
2020.10.23 09:38:45.417 1: PERL WARNING: Bareword found where operator expected at (eval 10833430) line 1, near "1 Speak1"
2020.10.23 09:38:45.418 1: PERL WARNING: Number found where operator expected at (eval 10833430) line 1, near "Speak1 30"
2020.10.23 09:38:45.418 1: PERL WARNING: Bareword found where operator expected at (eval 10833430) line 1, near "30 Vicki"
2020.10.23 09:38:45.418 1: di_Geige_Erinnerung error in fhem(set (Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 30 Vicki <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>): syntax error at (eval 10833430) line 1, near "):"


Und wenn ich das wie folgt mache:
set_Exec("timer_Geige",'$count*120','fhem($cmd)','$count<3');;
Dann kommt die Fehlermeldung:
2020.10.23 09:45:12.603 1: di_Geige_Erinnerung error in fhem($cmd): Global symbol "$cmd" requires explicit package name (did you forget to declare "my $cmd"?) at (eval 10847088) line 1.

Wie rufe ich das set_Exec richtig auf?

Danke im Voraus
lg, Gerhard

$cmd ist bei dir eine lokale Variable, die ist in set_Exec unbekannt. Du kannst es mit Instanzvariablen probieren, statt $cmd also mit $_cmd arbeiten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Hallo und guten Morgen,

Mit dem ,,$_cmd" klappt es.
Danke!

Eigentlich ist das mit dem $cmd nur eine Hilfskonstruktion, weil ich es nicht schaffe den Aufruf von set_Exec mit einem Reading eines anderen Devices hinzubekommen.

Wie würde der Aufruf von set_Exec aussehen, wenn ich das $_cmd direkt hinschreibe?
Ich komme da mit der Setzung der (unterschiedlichen) Hochkommas nicht klar.

Danke im Voraus
Lg, Gerhard 

Damian

#5
set_Exec("timer_Geige",'$count*120','fhem_set("(Sonos_Kueche):FILTER=r:IsMaster=1 Speak1 ". ReadingsVal("dyParameter","Stimme_Nachrichten_Vol","30")." ".ReadingsVal("dyParameter","Stimme_Nachrichten","Vicki")." <speak>Guten Morgen! Heute ist Donnerstag. Bitte die Geige nicht vergessen.</speak>")','$count<3');;

Außen einfache Anführungszeichen - innen doppelte. Statt fhem("set ... fhem_set("... benutzen, dann braucht man den FHEM-Parser nicht zu beanspruchen

Edit: Klammern beim fhem_set ergänzt
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF