Hallo zusammen,
das Problem scheint selten zu sein und ich finde nichts passendes im Forum.
Ich möchte gerne ein Shell-Script starten und die Ausgabe in ein Reading einlesen.
Konkret geht es hier darum die PID des aufgerufenen Programms in einem KILL Script wieder zu verwenden.
Gefunden habe ich den Befehl qx aber keine Doku hierzu. Kann jemand helfen?
Gruß Roman
Dazu gibt es auch Doku - qx ist ein Perl-Operator:
http://perldoc.perl.org/functions/qx%2FSTRING%2F
Danke aber das ist nicht das was ich suche. Muss in etwa so aussehen {qx (test.sh)}
eher { my $pid = qx("test.sh")}
Hi,
mein Vorschlag:
{my $var=qx (test.sh)}
@amenomade Ich hatte mir zu Deiner Variante mal das notiert:
ZitatAchtung: Die Verwendung von qx("") führt zu einer Fehlermeldung, da ist offenbar ein String Terminator zu viel.
Gruß Otto
Zitat von: Otto123 am 09 November 2020, 19:56:32
@amenomade Ich hatte mir zu Deiner Variante mal das notiert:
Stimmt. Ich wollte eher zeigen, wie man den Wert in einer Variable kriegt.
Nur am Rand: so muss natürlich test.sh in /opt/fhem liegen oder irgendwie beim PATH erreichbar sein. Und muss die richtige Berechtigungen haben.
:)
Ich hatte da mal etwas experimentiert und die Ergebnisse dokumentiert.
https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html
Vielleicht hilft das an der Stelle.
Gruß Otto
Danke euch allen. Werde ausprobieren. Gruß Roman
Ist es nicht besser das Programm "nur" Aufzurufen und dieses liefert selber die Werte Zurück? Also "push zu Fhem"
Hat den Vorteil, das FHEM nicht blockt. Ist zwar für einfache Operationen wie "Finde PID raus" etwas oversized, aber wenn man es sich einmal richtig eingewöhnt ...
Hallo Wernieman,
nun ist genau das passiert was du geschrieben hast. Ich kann das Script starte und erhalte erst nach Beendigung des Scripts meine PID zurück. Leider endet das SCript nur auf der Shell direct. Aus FHEM heraus aufgerufen muss ich den im Script gestartet Prozess immer erst beenden. Ziel war eigentlich anhand der PID das im Script aufgerufenen Programm gezielt zu beenden. Wie funktioniert dein Weg? Ich habe was gelesen in der form"perl fhem 7072 "set VAR 123", leider findet perl den port nicht.
Gruß Roman
Hallo Roman,
Vorschlag
mit diesem Script (https://github.com/heinz-otto/fhemcl) kannst Du in FHEM Dummy Readings sonstwas setzen.
Also Ruf dein Script einfach mit "ScriptName" in FHEM auf (ohne Perl, ohne system, ohne qx!) und melde dort in deinem Script mit meinem Script an FHEM deine PID zurück.
Geht sicher auch völlig anders, aber um da mitzudenken müsstest Du noch mehr erzählen ;)
Gruß Otto
Hallo zusammen, was für ein langer Weg. Aber ich hab's so geschafft:
telnetport eingerichtet (define telnetport telnet 7072)
shell gestartet (system <script> &)
Im Script dann mit perl /opt/fhem/fhem.pl <IP>:7072 "set YICAM01_record PID $PID" das Reading gesetzt.
Danke an alle die mir geholfen haben. Für Verbesserungen bin ich immer zu haben.
naja Verbesserung ist es nicht - aber wie gesagt:
Falls du nur den Aufruf (system <script> &) machst geht in FHEM auch "<script>" https://fhem.de/commandref_DE.html#command
Und mit mit meinem fhemcl "sparst" Du Dir Telnet und machst:
bash /opt/fhem/fhemcl.sh <IP>:8083 "set YICAM01_record PID $PID"
anstatt mit fhem.pl kannst Du auch mit nc die Daten zu fhem puschen.
Wenn kein Passwort in FHEM-telnet definiert z.B. durch:
echo -en "<fhem-Befehl>\nquit\n" | $nc -w 5 localhost 7072 >/dev/null
Wenn Passwort, ist dieses vor dem FHEM-Befehl (und Enter=\n" einzugeben
Wenn Du telnet mit SSL geschützt hast, gibt es in der Doku auch Hinweise (oder hier):
echo -en "<fhem-Befehl>\nquit\n" | /usr/bin/ncat -w10 -4 --ssl <fhem-Server> 7073
Hinweis: Alles mit <..> bitte passend ersetzen ...
Hallo,
ich stehe vor einem ähnlichen Problem. Ich habe es nach 6 Jahren endlich geschafft meine Stromzähler (DRS110M mit IEC1107 Protokoll) mit dem Script von patmen (Beitrag ==> https://forum.fhem.de/index.php/topic,105726.0.html (https://forum.fhem.de/index.php/topic,105726.0.html)) auszulesen. Da es noch kein FHEM-Modul gibt würde ich gerne das Script von FHEM aus auf dem RasPi starten und dann die Ausgabe der Daten nach FHEM senden.
Diese sehen so aus:ZitatMeter: 1613300191
Current : 0.3 A
Temperature : 40 °C
Time : 2021-12-30T17:48:40
Reactive Power : 80 VAr
Frequency : 50 Hz
Active Power : 0 W
Voltage : 229.6 V
Apparent Power : 80 VA
Active Energy : 00303842 Wh
log off from 1613300191
Ich habe schon Einiges gelesen, aber nicht genug verstanden um das programmtechnisch umzusetzen. Das Script kann ich ja z.B. mit {my $datenZaehler=qx (drs110m.pl)} über ein at starten, oder?
Um das Blockieren von FHEM zu verhindern wäre es (wenn ich das richtig verstanden habe) sinnvoll die erzeugten Daten dann vom Perl-Script selber über HTTP an FHEM (in einen Dummy?) senden zu lassen. Dafür müßten dann die HTTP-Befehle in das Perl-Script eingebaut werden, oder?
Für die exakte Syntax fehlt mir leider das Know How. Es wäre super wenn mir da Jemand unter die Arme greifen könnte.
Wenn ich mal auf Ottos Block verweisen darf:
https://heinz-otto.blogspot.com/2019/02/fhem-http-client.html (https://heinz-otto.blogspot.com/2019/02/fhem-http-client.html)
Oder in diesem Thread verwies Otto schon darauf:
https://github.com/heinz-otto/fhemcl (https://github.com/heinz-otto/fhemcl)
Und bitte ... kannst Du ein neuen Thread für ein neues Problem aufmachen?
Hallo Werniemann,
Danke für die Links. Die hatte ich tatsächlich schon selbst gefunden, allerdings hatte ich da einige Verständnisprobleme in der Anwendung.
Allerdings hat mich inzwischen CoolTux super unterstützt und es prinzipiell zum Laufen gebracht. Näheres zum Stand ==> hier: https://forum.fhem.de/index.php/topic,105726.15.html (https://forum.fhem.de/index.php/topic,105726.15.html)