Shell mit qx ausführen und Rückgabe in Reading einlesen.

Begonnen von romakrau, 09 November 2020, 19:07:16

Vorheriges Thema - Nächstes Thema

romakrau

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

xenos1984


romakrau

Danke aber das ist nicht das was ich suche. Muss in etwa so aussehen {qx (test.sh)}

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

#4
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

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.

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

:)
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

romakrau


Wernieman

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 ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

romakrau

#9
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

Otto123

Hallo Roman,

Vorschlag
mit diesem Script 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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

romakrau

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.


Otto123

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"
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

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 ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Guzzi-Charlie

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) 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.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2