Hallo zusammen,
ich stehe gerade auf dem Schlauch beim Vermischen von FHEM & Perl-Code in einer MyUtils-Funktion.
Und zwar geht es um eine Wiederholungsschleife eines Alarmtons, der per system-Befehl über Analog-Out ausgegeben wird.
#Routine für mehrfache, zeitverzögerte Auslösung des Funk-Gongs
#Heiko 21.03.2015
#Parameter-Reihenfolge
# 1) Anzahl der Wiederholungen
# 2) Name des ausloesenden FernAlarmDummies
# 3) Dateiname der Mp3-Datei, die wiedergegeben werden soll
sub Mp3TonLokalWiedergeben($$$) {
my ($AnzahlWiederholungen, $NameAlarmDummy, $DateinameMp3) = @_;
if ( Value($NameAlarmDummy) eq "on" ) {
Log 3, "Dummy ".$NameAlarmDummy." wurde auf on geschaltet, somit Funkgong auslösen.";
# Zuerst den Klingelton wiedergeben.
system("mpg321 /opt/fhemmp3/".$DateinameMp3);
# Nach 10 Sekunden nochmal den Klingelton abspielen.
fhem("define ".$NameAlarmDummy."Temp2 at +*{".($AnzahlWiederholungen-1)."}00:00:10 { system('mpg321 /opt/fhemmp3/'.$DateinameMp3); }");
fhem("attr ".$NameAlarmDummy."Temp2 room Alarme");
Log 3, "Wiederholungstimer wurde eingerichtet mit insgesamt: ".$AnzahlWiederholungen." (Funktion Mp3TonLokalWiedergeben)";
}
else {
# Log 3, "Dummy ".$NameAlarmDummy." wurde auf off geschaltet, somit keine Aktion.";
}
}
Der erste Aufruf funktioniert:
system("mpg321 /opt/fhemmp3/".$DateinameMp3);
Das verzögerte define
fhem("define ".$NameAlarmDummy."Temp2 at +*{".($AnzahlWiederholungen-1)."}00:00:10 { system('mpg321 /opt/fhemmp3/'.$DateinameMp3); }");
führt zu in fhem:
DEF = +*{1}00:00:10 { system('mpg321 /opt/fhemmp3/'.002_Bewegungsmelder_Wohnzimmer.mp3); }
Das funktioniert logischerweise nicht, es stimmt ja auch der Pfad der MP3-Datei nicht.
Denn nach dem Verzeichnis kommt erstmal '. , und das ist falsch (siehe oben).
Verwende ich im define aber den Aufruf mit " ", kommt schon beim Speichern der MyUtils eine Warnung von FHEM.
Wo ist mein Denkfehler?
Wie wäre es richtig?
Vielen Dank,
viele Grüße,
Heiko
Zitat von: heikoh81 am 21 März 2015, 17:44:54
beim Vermischen von FHEM & Perl-Code in einer MyUtils-Funktion.
Einfache Regel: In einer MyUtils-Funktion gibt es ausschließlich perl Code.
Ja, aber ich springe doch mit dem PERL-Befehl fhem(""); wieder zu fhem ab, um dort ein temporäres define zu erstellen.
Geht das direkt in Perl?
So funktioniert es zwischenzeitlich, d.h. ich definiere zunächst den gesamten system-Befehl als string, und den übergebe ich dann zwischen zwei Hochkomma ' '.
my $pfad = "mpg321 /opt/fhemmp3/".$DateinameMp3;
fhem("define ".$NameAlarmDummy."Temp2 at +*{".($AnzahlWiederholungen-1)."}00:00:10 { system('$pfad');; }");
Muss doch aber eleganter gehen?
Grüße,
Heiko
Zitat von: heikoh81 am 21 März 2015, 18:32:43
Ja, aber ich springe doch mit dem PERL-Befehl fhem(""); wieder zu fhem ab,
Nein, Du springst nicht ab, Du rufst in perl eine Funktion auf, die fhem()
heißt und irgendwas tut.
Zitat von: heikoh81 am 21 März 2015, 18:32:43
Geht das direkt in Perl?
Das
ist perl!
Das meine ich doch. Mit dem Perl-Funktionsaufruf
fhem("........
befinde ich mich natürlich noch in Perl, will aber eine FHEM-Funktion absetzen, als ob ich diese im WebIF in die Zeile oben eingebe und ENTER drücke.
Und hierbei scheint bei meinem nicht funktionierenden Code-Beispiel irgendetwas nicht zu klappen.
D.h. konkret der Pfad wird falsch zusammengebaut:
fhem("define ".$NameAlarmDummy."Temp2 at +*{".($AnzahlWiederholungen-1)."}00:00:10 { system('mpg321 /opt/fhemmp3/'.$DateinameMp3); }");
was man auch am erstellen define in fhem sieht:
DEF = +*{1}00:00:10 { system('mpg321 /opt/fhemmp3/'.002_Bewegungsmelder_Wohnzimmer.mp3); }
Hinter /opt/fhemmp3/ wird '. eingebaut, statt direkt dem Dateinamen.
Nun müsste mein Code-Beispiel so umgebaut werden, dass das '. nicht erscheint.
Wer könnte mir hier einen Hinweis geben, wo der Fehler liegt.
Viele Grüße,
Heiko