Perl-Code in define at: " Vs. '

Begonnen von heikoh81, 21 März 2015, 17:44:54

Vorheriges Thema - Nächstes Thema

heikoh81

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

heikoh81

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

betateilchen

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!
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

heikoh81

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