Hallo.
Wie schafft man es einen Wert in einen Text einzugeben?
würde gerne die xx fhem("\"python2 /usr/local/bin/xxAmp.py\""); mit Wert von
my $cmd = $ladestrom + $Amp;
ersetzen. Ist sicher nicht einfach. Hat wer Tip für mich?
LG
Hallo,
kann mir vorstellen das es so klappen kann:
fhem(qq(python2 /usr/local/bin/$cmdAmp.py));
Gruß Thomas
Ich hätte eher folgendes vermutet:
ungetestet:
fhem("qq(python2 /usr/local/bin/.$cmd.Amp.py)");
Warum gehst du über Fhem?
mit
system("python2 /usr/local/bin/.$cmd.Amp.py");
sollte es auch funktionieren
evtl. auch ohne ".", sind "nur" Verbinder
P.S. wieso schreibst du den errechneten wert vor das Skript?
Das kann doch so nicht existieren/funktionieren...
ich geh mal Popcorn machen, das könnte hier noch lustig werden ...
Ehrlich gesagt habe ich die Aufgabe noch nicht völlig verstanden. Aber:
Zitat von: satprofi am 11 April 2025, 13:10:24Hat wer Tip für mich?
- Ich hatte hier (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html)mal ziemlich viele Varianten aufgeschrieben.
- Man könnte ein Script machen und die Unterschiede als Argument übergeben, anstatt den Namen des Scriptes zu patchen.
- Ich würde im Perl dann nicht noch FHEM bemühen um einen "system" Aufruf zu machen. Ich würde gleich den system() Aufruf in Perl verwenden.
Ich glaube die bisherigen Vorschläge sind alle nicht getestet? ;)
Hallo Otto, danke.
Meine Bsp. waren nicht getestet, hatte keine Möglichkeit.
Dann lag ich aber mit system() richtig...
...ich hatte nur die inneren Quotes unterschlagen.
system('python2 /usr/local/bin/'.$cmd.'Amp.py');
evtl. muss man doppelte Quotes " verwenden.
Mein erster Vorschlag mit qq() funktioniert nicht, hätte besser meinen ersten Gedanken gepostet...
fhem("\"python2 /usr/local/bin/".$cmd."Amp.py\"")
....Hauptsache @betateilchen wird satt. 8)
Zitat von: Otto123 am 11 April 2025, 15:40:57Ehrlich gesagt habe ich die Aufgabe noch nicht völlig verstanden. Aber:
Zitat von: satprofi am 11 April 2025, 13:10:24Hat wer Tip für mich?
- Ich hatte hier (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html)mal ziemlich viele Varianten aufgeschrieben.
- Man könnte ein Script machen und die Unterschiede als Argument übergeben, anstatt den Namen des Scriptes zu patchen.
- Ich würde im Perl dann nicht noch FHEM bemühen um einen "system" Aufruf zu machen. Ich würde gleich den system() Aufruf in Perl verwenden.
Ich glaube die bisherigen Vorschläge sind alle nicht getestet? ;)
Zumindest wird erstmal richtig ausgegeben
{my $a = "36";;qx "echo ".'/usr/local/bin/'.$a.'Amp.py'}
Jetzt umgemodelt auf
{my $a = "$cmd";;qx "echo ".'/usr/local/bin/'.$a.'Amp.py'}
Muss jetzt nur mehr Echo richtig ersetzen
Zitat von: satprofi am 11 April 2025, 17:52:53my $a = "$cmd"
Bei Variablen setzt man keine Quotes
my $a = $cmd;
Quotes sind für Strings...
einfache => String wird 1:1 übernommen
doppelt => Variablen etc. werden ausgewertet (durch den Inhalt ersetzt)
In deinem Fall machst du aus einer Zahl sowieso einen String. Bei Perl funktioniert das.
Habe das Beispiel von Otto herangezogen
{my $a = "test";;qx "echo ".'"'.$a.'"'}
Zitat von: satprofi am 11 April 2025, 19:38:18Habe das Beispiel von Otto herangezogen
{my $a = "test";;qx "echo ".'"'.$a.'"'}
"test"
ist ein String
$cmd
ist eine Variable
...sollte man schon unterscheiden.
Immer noch mobil, aber kurz nachvollzogen. Bin der Meinung schon nahe an einer funktionierenden Umsetzung gewesen zu sein. In meinem Vorschlag müsste man doch nur die fhem-Funktion durch den system-Befehl ersetzen !?
Und die blockiert nicht, mein ich.
Zitat von: TomLee am 11 April 2025, 20:26:59Immer noch mobil, aber kurz nachvollzogen. Bin der Meinung schon nahe an einer funktionierenden Umsetzung gewesen zu sein. In meinem Vorschlag müsste man doch nur die fhem-Funktion durch den system-Befehl ersetzen !?
Und die blockiert nicht, mein ich.
Nach meinem Test, allerdings mit Online-Compiler und print, wird die Variable nicht erkannt. Vermutlich weil sie nicht abgrenzbar ist. D.h. es wird nur der Pfad bis zum Slash ausgegeben.
Das Blockieren muss man wahrscheinlich mit & o.ä. unterbinden. Bei Python habe ich keine Erfahrung...
Mein Test-Skript wird so ausgeführt:
{my $var = 'test3';;system(qq(python3 $var.py &))}
Darum gehe ich davon aus das mein Vorschlag klappt.
Zitat von: TomLee am 11 April 2025, 21:41:11Mein Test-Skript wird so ausgeführt:
{my $var = 'test3';;system(qq(python3 $var.py &))}
Darum gehe ich davon aus das mein Vorschlag klappt.
Das funktioniert, gerade getestet. Dann musst du aber den Pfad+Variable+Skript vorher zusammen bauen. Ob das einfacher ist...
ZitatDann musst du aber den Pfad+Variable+Skript vorher zusammen bauen. Ob das einfacher ist...
Bist Dir da sicher? Habs net ausprobiert...
Warum sollte das nicht klappen:
system(qq(python2 /usr/local/bin/$cmdAmp.py));
?
_pop_
{my $var = 'test3';;system(qq(python3 /opt/fhem/$var.py &))}
funzt!
Zitat von: TomLee am 11 April 2025, 22:15:00_pop_
{my $var = 'test3';;system(qq(python3 /opt/fhem/$var.py &))}
funzt!
Vermutlich ist hier die Variable durch den Punkt abgegrenzt. Ob das Skript so gestartet wird hat du aber nicht getestet!?
Diese Variable gibt es nicht
$cmdAmp
, deswegen funktioniert es auch nicht (getestet).
$a = 123;
print qq(test $ab.py &)
Ausgabe:
test .py &
$a = 123;
print qq(test $a.b.py &)
Ausgabe:
test 123.b.py &
Der Punkt grenzt die Variable ab.
Stimmt, hast recht.
Dagegen kann man aber was machen und die Variable in geschweiften Klammern angeben:
{my $var = 'te';;system("python3 /opt/fhem/${var}st3.py &")}
Zitat von: TomLee am 11 April 2025, 22:46:17Stimmt, hast recht.
Dagegen kann man aber was machen und die Variable in geschweiften Klammern angeben:
{my $var = 'te';;system("python3 /opt/fhem/${var}st3.py &")}
Sooo klapts, Danke !
testweise
{my $var = $cmd;;system("/user/local/bin/${var}Amp.py &")};
ergibt sh: 1: /user/local/bin/24Amp.py: not found
my $var = "te";
my $cmd = sprintf("python3 /opt/fhem/%sst3.py &",$var);
system $cmd;
Schmeckt wie drei Tage altes Popcorn ...
Interessant bei der sprintf-Variante ist, das die Platzhalter ohne Abgrenzung verwendet werden können.
Es sind halt tatsächlich Platzhalter, die in ihrer Form schon abgegrenzt sind, und keine Variablennamen.
Und die Variante funktioniert nach diesem Prinzip in vielen mir bekannten Programmiersprachen.